Commit aed49c06 authored by Stephane Nicoll's avatar Stephane Nicoll

Add configuration option for GridFsTemplate's bucket

Closes gh-22854
parent ee41d71e
......@@ -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);
}
......
......@@ -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<MongoDatabase> getMongoDatabase() throws DataAccessException {
String gridFsDatabase = this.properties.getGridFsDatabase();
String gridFsDatabase = this.properties.getGridfs().getDatabase();
if (StringUtils.hasText(gridFsDatabase)) {
return this.delegate.getMongoDatabase(gridFsDatabase);
}
......
......@@ -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;
}
}
}
......@@ -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) -> {
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment