From aed49c06312b9ae7b55ceddab4e95c96aa46f333 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 20 Aug 2020 10:42:30 +0200 Subject: [PATCH] Add configuration option for GridFsTemplate's bucket Closes gh-22854 --- ...DatabaseFactoryDependentConfiguration.java | 9 ++-- .../MongoReactiveDataAutoConfiguration.java | 9 ++-- .../autoconfigure/mongo/MongoProperties.java | 52 ++++++++++++++++--- .../MongoDataAutoConfigurationTests.java | 20 +++++++ ...ngoReactiveDataAutoConfigurationTests.java | 16 ++++++ 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.java index 014fa4b1c93..9639b743b3a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoDatabaseFactoryDependentConfiguration.java @@ -23,6 +23,7 @@ import com.mongodb.client.MongoDatabase; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.mongo.MongoProperties; +import org.springframework.boot.autoconfigure.mongo.MongoProperties.Gridfs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.dao.DataAccessException; @@ -76,12 +77,12 @@ class MongoDatabaseFactoryDependentConfiguration { @ConditionalOnMissingBean(GridFsOperations.class) GridFsTemplate gridFsTemplate(MongoDatabaseFactory factory, MongoTemplate mongoTemplate) { return new GridFsTemplate(new GridFsMongoDatabaseFactory(factory, this.properties), - mongoTemplate.getConverter()); + mongoTemplate.getConverter(), this.properties.getGridfs().getBucket()); } /** - * {@link MongoDatabaseFactory} decorator to respect - * {@link MongoProperties#getGridFsDatabase()} if set. + * {@link MongoDatabaseFactory} decorator to respect {@link Gridfs#getDatabase()} if + * set. */ static class GridFsMongoDatabaseFactory implements MongoDatabaseFactory { @@ -98,7 +99,7 @@ class MongoDatabaseFactoryDependentConfiguration { @Override public MongoDatabase getMongoDatabase() throws DataAccessException { - String gridFsDatabase = this.properties.getGridFsDatabase(); + String gridFsDatabase = this.properties.getGridfs().getDatabase(); if (StringUtils.hasText(gridFsDatabase)) { return this.mongoDatabaseFactory.getMongoDatabase(gridFsDatabase); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration.java index 353e8fe84b0..c76c89c456d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.mongo.MongoProperties; +import org.springframework.boot.autoconfigure.mongo.MongoProperties.Gridfs; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -113,12 +114,12 @@ public class MongoReactiveDataAutoConfiguration { MongoProperties properties) { return new ReactiveGridFsTemplate(dataBufferFactory, new GridFsReactiveMongoDatabaseFactory(reactiveMongoDatabaseFactory, properties), mappingMongoConverter, - null); + properties.getGridfs().getBucket()); } /** - * {@link ReactiveMongoDatabaseFactory} decorator to use - * {@link MongoProperties#getGridFsDatabase()} when set. + * {@link ReactiveMongoDatabaseFactory} decorator to use {@link Gridfs#getDatabase()} + * when set. */ static class GridFsReactiveMongoDatabaseFactory implements ReactiveMongoDatabaseFactory { @@ -138,7 +139,7 @@ public class MongoReactiveDataAutoConfiguration { @Override public Mono getMongoDatabase() throws DataAccessException { - String gridFsDatabase = this.properties.getGridFsDatabase(); + String gridFsDatabase = this.properties.getGridfs().getDatabase(); if (StringUtils.hasText(gridFsDatabase)) { return this.delegate.getMongoDatabase(gridFsDatabase); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java index 0224d9b12ec..e400d8f1a6d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java @@ -20,6 +20,7 @@ import com.mongodb.ConnectionString; import org.bson.UuidRepresentation; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; /** * Configuration properties for Mongo. @@ -74,10 +75,7 @@ public class MongoProperties { */ private String authenticationDatabase; - /** - * GridFS database name. - */ - private String gridFsDatabase; + private final Gridfs gridfs = new Gridfs(); /** * Login user of the mongo server. Cannot be set with URI. @@ -193,12 +191,24 @@ public class MongoProperties { this.port = port; } + public Gridfs getGridfs() { + return this.gridfs; + } + + /** + * Return the GridFS database name. + * @return the GridFS database name + * @deprecated since 2.4.0 in favor of {@link Gridfs#getDatabase()} + */ + @DeprecatedConfigurationProperty(replacement = "spring.data.mongodb.gridfs.database") + @Deprecated public String getGridFsDatabase() { - return this.gridFsDatabase; + return this.gridfs.getDatabase(); } + @Deprecated public void setGridFsDatabase(String gridFsDatabase) { - this.gridFsDatabase = gridFsDatabase; + this.gridfs.setDatabase(gridFsDatabase); } public String getMongoClientDatabase() { @@ -216,4 +226,34 @@ public class MongoProperties { this.autoIndexCreation = autoIndexCreation; } + public static class Gridfs { + + /** + * GridFS database name. + */ + private String database; + + /** + * GridFS bucket name. + */ + private String bucket; + + public String getDatabase() { + return this.database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getBucket() { + return this.bucket; + } + + public void setBucket(String bucket) { + this.bucket = bucket; + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfigurationTests.java index 35c61607de7..27e70829309 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoDataAutoConfigurationTests.java @@ -71,6 +71,17 @@ class MongoDataAutoConfigurationTests { @Test void whenGridFsDatabaseIsConfiguredThenGridFsTemplateIsAutoConfiguredAndUsesIt() { + this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.database:grid").run((context) -> { + assertThat(context).hasSingleBean(GridFsTemplate.class); + GridFsTemplate template = context.getBean(GridFsTemplate.class); + MongoDatabaseFactory factory = (MongoDatabaseFactory) ReflectionTestUtils.getField(template, "dbFactory"); + assertThat(factory.getMongoDatabase().getName()).isEqualTo("grid"); + }); + } + + @Test + @Deprecated + void whenGridFsDatabaseIsConfiguredWithDeprecatedPropertyThenGridFsTemplateIsAutoConfiguredAndUsesIt() { this.contextRunner.withPropertyValues("spring.data.mongodb.gridFsDatabase:grid").run((context) -> { assertThat(context).hasSingleBean(GridFsTemplate.class); GridFsTemplate template = context.getBean(GridFsTemplate.class); @@ -79,6 +90,15 @@ class MongoDataAutoConfigurationTests { }); } + @Test + void whenGridFsBucketIsConfiguredThenGridFsTemplateIsAutoConfiguredAndUsesIt() { + this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.bucket:test-bucket").run((context) -> { + assertThat(context).hasSingleBean(GridFsTemplate.class); + GridFsTemplate template = context.getBean(GridFsTemplate.class); + assertThat(template).hasFieldOrPropertyWithValue("bucket", "test-bucket"); + }); + } + @Test void customConversions() { this.contextRunner.withUserConfiguration(CustomConversionsConfig.class).run((context) -> { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfigurationTests.java index adea52ebdaa..f949c490681 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/mongo/MongoReactiveDataAutoConfigurationTests.java @@ -54,10 +54,26 @@ class MongoReactiveDataAutoConfigurationTests { @Test void whenGridFsDatabaseIsConfiguredThenGridFsTemplateUsesIt() { + this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.database:grid") + .run((context) -> assertThat(grisFsTemplateDatabaseName(context)).isEqualTo("grid")); + } + + @Test + @Deprecated + void whenGridFsDatabaseIsConfiguredWithDeprecatedPropertyThenGridFsTemplateUsesIt() { this.contextRunner.withPropertyValues("spring.data.mongodb.gridFsDatabase:grid") .run((context) -> assertThat(grisFsTemplateDatabaseName(context)).isEqualTo("grid")); } + @Test + void whenGridFsBucketIsConfiguredThenGridFsTemplateUsesIt() { + this.contextRunner.withPropertyValues("spring.data.mongodb.gridfs.bucket:test-bucket").run((context) -> { + assertThat(context).hasSingleBean(ReactiveGridFsTemplate.class); + ReactiveGridFsTemplate template = context.getBean(ReactiveGridFsTemplate.class); + assertThat(template).hasFieldOrPropertyWithValue("bucket", "test-bucket"); + }); + } + @Test void backsOffIfMongoClientBeanIsNotPresent() { ApplicationContextRunner runner = new ApplicationContextRunner().withConfiguration(AutoConfigurations