Browse Source

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
pull/47047/head
Andy Wilkinson 3 months ago
parent
commit
aa3bed5e28
  1. 30
      module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java
  2. 37
      module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java
  3. 37
      module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java
  4. 50
      module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java
  5. 1
      module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java
  6. 49
      module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java
  7. 6
      module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java

30
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; @@ -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 { @@ -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 { @@ -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();
}
}

37
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; @@ -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; @@ -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 { @@ -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 { @@ -139,15 +138,15 @@ public final class MongoReactiveDataAutoConfiguration {
@Override
public Mono<MongoDatabase> 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

37
module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java

@ -97,21 +97,6 @@ class MongoDataAutoConfigurationTests { @@ -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<GridFSBucket>) 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 { @@ -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<MongoClient, Boolean> {
@Override

50
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; @@ -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; @@ -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 { @@ -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<GridFSBucket>) 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 { @@ -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";
}
};
}
};
}
}
}

1
module/spring-boot-mongodb/src/dockerTest/java/org/springframework/boot/mongodb/docker/compose/MongoDockerComposeConnectionDetailsFactoryIntegrationTests.java

@ -55,7 +55,6 @@ class MongoDockerComposeConnectionDetailsFactoryIntegrationTests { @@ -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();
}
}

49
module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoConnectionDetails.java

@ -46,53 +46,4 @@ public interface MongoConnectionDetails extends ConnectionDetails { @@ -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;
}
};
}
}
}

6
module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/PropertiesMongoConnectionDetails.java

@ -100,12 +100,6 @@ public class PropertiesMongoConnectionDetails implements MongoConnectionDetails @@ -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();

Loading…
Cancel
Save