From aa3bed5e28470d7f02814e30bd570ec50a4f0c23 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 4 Sep 2025 18:01:18 +0100 Subject: [PATCH] Remove GridFS from MongoConnectionDetails GridFS is a concept specific to Spring Data MongoDB while MongoConnectionDetails provides general details for connecting to MongoDB, with or without Spring Data MongoDB. As such GridFS does not belong on MongoConnectionDetails and this commit removes it. Support for configuring GridFS through properties remains. Closes gh-47044 --- ...DatabaseFactoryDependentConfiguration.java | 30 +++++------ .../MongoReactiveDataAutoConfiguration.java | 37 +++++++------- .../MongoDataAutoConfigurationTests.java | 37 -------------- ...ngoReactiveDataAutoConfigurationTests.java | 50 ------------------- ...nectionDetailsFactoryIntegrationTests.java | 1 - .../autoconfigure/MongoConnectionDetails.java | 49 ------------------ .../PropertiesMongoConnectionDetails.java | 6 --- 7 files changed, 31 insertions(+), 179 deletions(-) diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java index 95c7a00f5ac..1e08bdc5913 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java @@ -23,8 +23,6 @@ import org.jspecify.annotations.Nullable; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; -import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails.GridFs; import org.springframework.boot.mongodb.autoconfigure.MongoProperties; import org.springframework.boot.mongodb.autoconfigure.MongoProperties.Gridfs; import org.springframework.context.annotation.Bean; @@ -59,34 +57,32 @@ class MongoDatabaseFactoryDependentConfiguration { @Bean @ConditionalOnMissingBean(GridFsOperations.class) - GridFsTemplate gridFsTemplate(MongoProperties properties, MongoDatabaseFactory factory, MongoTemplate mongoTemplate, - MongoConnectionDetails connectionDetails) { - return new GridFsTemplate(new GridFsMongoDatabaseFactory(factory, connectionDetails), - mongoTemplate.getConverter(), - (connectionDetails.getGridFs() != null) ? connectionDetails.getGridFs().getBucket() : null); + GridFsTemplate gridFsTemplate(MongoProperties properties, MongoDatabaseFactory factory, + MongoTemplate mongoTemplate) { + return new GridFsTemplate(new GridFsMongoDatabaseFactory(factory, properties), mongoTemplate.getConverter(), + properties.getGridfs().getBucket()); } /** - * {@link MongoDatabaseFactory} decorator to respect {@link Gridfs#getDatabase()} or - * {@link GridFs#getGridFs()} from the {@link MongoConnectionDetails} if set. + * {@link MongoDatabaseFactory} decorator to respect {@link Gridfs#getDatabase()} if + * set. */ static class GridFsMongoDatabaseFactory implements MongoDatabaseFactory { private final MongoDatabaseFactory mongoDatabaseFactory; - private final MongoConnectionDetails connectionDetails; + private final MongoProperties properties; - GridFsMongoDatabaseFactory(MongoDatabaseFactory mongoDatabaseFactory, - MongoConnectionDetails connectionDetails) { + GridFsMongoDatabaseFactory(MongoDatabaseFactory mongoDatabaseFactory, MongoProperties properties) { Assert.notNull(mongoDatabaseFactory, "'mongoDatabaseFactory' must not be null"); - Assert.notNull(connectionDetails, "'connectionDetails' must not be null"); + Assert.notNull(properties, "'properties' must not be null"); this.mongoDatabaseFactory = mongoDatabaseFactory; - this.connectionDetails = connectionDetails; + this.properties = properties; } @Override public MongoDatabase getMongoDatabase() throws DataAccessException { - String gridFsDatabase = getGridFsDatabase(this.connectionDetails); + String gridFsDatabase = getGridFsDatabase(); if (StringUtils.hasText(gridFsDatabase)) { return this.mongoDatabaseFactory.getMongoDatabase(gridFsDatabase); } @@ -113,8 +109,8 @@ class MongoDatabaseFactoryDependentConfiguration { return this.mongoDatabaseFactory.withSession(session); } - private @Nullable String getGridFsDatabase(MongoConnectionDetails connectionDetails) { - return (connectionDetails.getGridFs() != null) ? connectionDetails.getGridFs().getDatabase() : null; + private @Nullable String getGridFsDatabase() { + return this.properties.getGridfs().getDatabase(); } } diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java index 3cc17df9072..cf4952a2e72 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java @@ -34,8 +34,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; -import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails.GridFs; import org.springframework.boot.mongodb.autoconfigure.MongoProperties; +import org.springframework.boot.mongodb.autoconfigure.MongoProperties.Gridfs; import org.springframework.boot.mongodb.autoconfigure.MongoReactiveAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -76,18 +76,19 @@ import org.springframework.util.StringUtils; @Import(MongoDataConfiguration.class) public final class MongoReactiveDataAutoConfiguration { - private final MongoConnectionDetails connectionDetails; + private final MongoProperties properties; - MongoReactiveDataAutoConfiguration(MongoConnectionDetails connectionDetails) { - this.connectionDetails = connectionDetails; + MongoReactiveDataAutoConfiguration(MongoProperties properties) { + this.properties = properties; } @Bean @ConditionalOnMissingBean(ReactiveMongoDatabaseFactory.class) - SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoClient mongo, MongoProperties properties) { - String database = properties.getDatabase(); + SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoClient mongo, + MongoConnectionDetails connectionDetails) { + String database = this.properties.getDatabase(); if (database == null) { - database = this.connectionDetails.getConnectionString().getDatabase(); + database = connectionDetails.getConnectionString().getDatabase(); } Assert.hasText(database, "Database name must not be empty"); return new SimpleReactiveMongoDatabaseFactory(mongo, database); @@ -111,25 +112,23 @@ public final class MongoReactiveDataAutoConfiguration { ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory, MappingMongoConverter mappingMongoConverter, DataBufferFactory dataBufferFactory) { return new ReactiveGridFsTemplate(dataBufferFactory, - new GridFsReactiveMongoDatabaseFactory(reactiveMongoDatabaseFactory, this.connectionDetails), - mappingMongoConverter, - (this.connectionDetails.getGridFs() != null) ? this.connectionDetails.getGridFs().getBucket() : null); + new GridFsReactiveMongoDatabaseFactory(reactiveMongoDatabaseFactory, this.properties), + mappingMongoConverter, this.properties.getGridfs().getBucket()); } /** - * {@link ReactiveMongoDatabaseFactory} decorator to use {@link GridFs#getGridFs()} - * from the {@link MongoConnectionDetails} when set. + * {@link ReactiveMongoDatabaseFactory} decorator to use {@link Gridfs#getDatabase()} + * from the {@link MongoProperties} when set. */ static class GridFsReactiveMongoDatabaseFactory implements ReactiveMongoDatabaseFactory { private final ReactiveMongoDatabaseFactory delegate; - private final MongoConnectionDetails connectionDetails; + private final MongoProperties properties; - GridFsReactiveMongoDatabaseFactory(ReactiveMongoDatabaseFactory delegate, - MongoConnectionDetails connectionDetails) { + GridFsReactiveMongoDatabaseFactory(ReactiveMongoDatabaseFactory delegate, MongoProperties properties) { this.delegate = delegate; - this.connectionDetails = connectionDetails; + this.properties = properties; } @Override @@ -139,15 +138,15 @@ public final class MongoReactiveDataAutoConfiguration { @Override public Mono getMongoDatabase() throws DataAccessException { - String gridFsDatabase = getGridFsDatabase(this.connectionDetails); + String gridFsDatabase = getGridFsDatabase(); if (StringUtils.hasText(gridFsDatabase)) { return this.delegate.getMongoDatabase(gridFsDatabase); } return this.delegate.getMongoDatabase(); } - private @Nullable String getGridFsDatabase(MongoConnectionDetails connectionDetails) { - return (connectionDetails.getGridFs() != null) ? connectionDetails.getGridFs().getDatabase() : null; + private @Nullable String getGridFsDatabase() { + return this.properties.getGridfs().getDatabase(); } @Override diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java index 5656bc6452f..fa7d70ab4a0 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java @@ -97,21 +97,6 @@ class MongoDataAutoConfigurationTests { }); } - @Test - @SuppressWarnings("unchecked") - void usesMongoConnectionDetailsIfAvailable() { - this.contextRunner.withUserConfiguration(ConnectionDetailsConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(GridFsTemplate.class); - GridFsTemplate template = context.getBean(GridFsTemplate.class); - GridFSBucket bucket = ((Supplier) ReflectionTestUtils.getField(template, "bucketSupplier")) - .get(); - assertThat(bucket.getBucketName()).isEqualTo("connection-details-bucket"); - assertThat(bucket).extracting("filesCollection", InstanceOfAssertFactories.type(MongoCollection.class)) - .extracting((collection) -> collection.getNamespace().getDatabaseName()) - .isEqualTo("grid-database-1"); - }); - } - @Test @SuppressWarnings("unchecked") void whenGridFsBucketIsConfiguredThenGridFsTemplateIsAutoConfiguredAndUsesIt() { @@ -370,28 +355,6 @@ class MongoDataAutoConfigurationTests { } - @Configuration(proxyBeanMethods = false) - static class ConnectionDetailsConfiguration { - - @Bean - MongoConnectionDetails mongoConnectionDetails() { - return new MongoConnectionDetails() { - - @Override - public ConnectionString getConnectionString() { - return new ConnectionString("mongodb://localhost/db"); - } - - @Override - public GridFs getGridFs() { - return GridFs.of("grid-database-1", "connection-details-bucket"); - } - - }; - } - - } - static class MyConverter implements Converter { @Override diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java index 2ffbe4f03ef..8428e89e311 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java @@ -18,7 +18,6 @@ package org.springframework.boot.data.mongodb.autoconfigure; import java.time.Duration; -import com.mongodb.ConnectionString; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.gridfs.GridFSBucket; import org.junit.jupiter.api.Test; @@ -26,12 +25,9 @@ import reactor.core.publisher.Mono; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; import org.springframework.boot.mongodb.autoconfigure.MongoReactiveAutoConfiguration; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory; @@ -74,18 +70,6 @@ class MongoReactiveDataAutoConfigurationTests { .run((context) -> assertThat(grisFsTemplateDatabaseName(context)).isEqualTo("grid")); } - @Test - @SuppressWarnings("unchecked") - void usesMongoConnectionDetailsIfAvailable() { - this.contextRunner.withUserConfiguration(ConnectionDetailsConfiguration.class).run((context) -> { - assertThat(grisFsTemplateDatabaseName(context)).isEqualTo("grid-database-1"); - ReactiveGridFsTemplate template = context.getBean(ReactiveGridFsTemplate.class); - GridFSBucket bucket = ((Mono) ReflectionTestUtils.getField(template, "bucketSupplier")) - .block(Duration.ofSeconds(30)); - assertThat(bucket.getBucketName()).isEqualTo("connection-details-bucket"); - }); - } - @Test @SuppressWarnings("unchecked") void whenGridFsBucketIsConfiguredThenGridFsTemplateUsesIt() { @@ -181,38 +165,4 @@ class MongoReactiveDataAutoConfigurationTests { return collection.getNamespace().getDatabaseName(); } - @Configuration(proxyBeanMethods = false) - static class ConnectionDetailsConfiguration { - - @Bean - MongoConnectionDetails mongoConnectionDetails() { - return new MongoConnectionDetails() { - - @Override - public ConnectionString getConnectionString() { - return new ConnectionString("mongodb://localhost/db"); - } - - @Override - public GridFs getGridFs() { - return new GridFs() { - - @Override - public String getDatabase() { - return "grid-database-1"; - } - - @Override - public String getBucket() { - return "connection-details-bucket"; - } - - }; - } - - }; - } - - } - } diff --git a/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java b/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java index b2e09545db1..b162d00b2d1 100644 --- a/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -55,7 +55,6 @@ class MongoDockerComposeConnectionDetailsFactoryIntegrationTests { assertThat(connectionString.getCredential().getPassword()).isEqualTo("secret".toCharArray()); assertThat(connectionString.getCredential().getSource()).isEqualTo("admin"); assertThat(connectionString.getDatabase()).isEqualTo(database); - assertThat(connectionDetails.getGridFs()).isNull(); } } diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java index cc544c987a4..b766c1b5ede 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java @@ -46,53 +46,4 @@ public interface MongoConnectionDetails extends ConnectionDetails { return null; } - /** - * GridFS configuration. - * @return the GridFS configuration or {@code null} - */ - default @Nullable GridFs getGridFs() { - return null; - } - - /** - * GridFS configuration. - */ - interface GridFs { - - /** - * GridFS database name. - * @return the GridFS database name or {@code null} - */ - @Nullable String getDatabase(); - - /** - * GridFS bucket name. - * @return the GridFS bucket name or {@code null} - */ - @Nullable String getBucket(); - - /** - * Factory method to create a new {@link GridFs} instance. - * @param database the database - * @param bucket the bucket name - * @return a new {@link GridFs} instance - */ - static GridFs of(@Nullable String database, @Nullable String bucket) { - return new GridFs() { - - @Override - public @Nullable String getDatabase() { - return database; - } - - @Override - public @Nullable String getBucket() { - return bucket; - } - - }; - } - - } - } diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java index f726b199589..2b24c0a0644 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java @@ -100,12 +100,6 @@ public class PropertiesMongoConnectionDetails implements MongoConnectionDetails return URLEncoder.encode(new String(input), StandardCharsets.UTF_8).toCharArray(); } - @Override - public GridFs getGridFs() { - return GridFs.of(PropertiesMongoConnectionDetails.this.properties.getGridfs().getDatabase(), - PropertiesMongoConnectionDetails.this.properties.getGridfs().getBucket()); - } - @Override public @Nullable SslBundle getSslBundle() { Ssl ssl = this.properties.getSsl();