From 670ba33bec4b0e578e6e113fed5b0b2890807472 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 20 Nov 2014 14:47:40 -0800 Subject: [PATCH] Improve MongoDataAutoConfiguration Update MongoDataAutoConfiguration to provide easier configuration of CustomConversions, the MappingMongoConverter, MongoMappingContext and an authentication database. Fixes gh-1619 Fixes gh-1730 --- .../mongo/MongoDataAutoConfiguration.java | 50 +++++++++++++++++-- .../autoconfigure/mongo/MongoProperties.java | 10 ++++ .../MongoDataAutoConfigurationTests.java | 39 +++++++++++++++ .../appendix-application-properties.adoc | 5 ++ .../spring-boot-sample-tomcat-jsp/.gitignore | 1 + .../spring-boot-sample-tomcat7-jsp/.gitignore | 1 + .../spring-boot-sample-traditional/.gitignore | 1 + .../spring-boot-sample-web-jsp/.gitignore | 1 + 8 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore create mode 100644 spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore create mode 100644 spring-boot-samples/spring-boot-sample-traditional/.gitignore create mode 100644 spring-boot-samples/spring-boot-sample-web-jsp/.gitignore diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java index f7581fabace..92623ba5756 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java @@ -18,6 +18,8 @@ package org.springframework.boot.autoconfigure.mongo; import java.net.UnknownHostException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -28,9 +30,16 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.dao.DataAccessException; import org.springframework.dao.support.PersistenceExceptionTranslator; +import org.springframework.data.authentication.UserCredentials; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoDbFactory; +import org.springframework.data.mongodb.core.convert.CustomConversions; +import org.springframework.data.mongodb.core.convert.DbRefResolver; +import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.gridfs.GridFsTemplate; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -50,6 +59,7 @@ import com.mongodb.Mongo; * @author Dave Syer * @author Oliver Gierke * @author Josh Long + * @author Phillip Webb * @since 1.1.0 */ @Configuration @@ -64,15 +74,45 @@ public class MongoDataAutoConfiguration { @Bean @ConditionalOnMissingBean public MongoDbFactory mongoDbFactory(Mongo mongo) throws Exception { - String db = this.properties.getMongoClientDatabase(); - return new SimpleMongoDbFactory(mongo, db); + String database = this.properties.getMongoClientDatabase(); + String authDatabase = this.properties.getAuthenticationDatabase(); + if (StringUtils.hasLength(authDatabase)) { + String username = this.properties.getUsername(); + String password = new String(this.properties.getPassword()); + UserCredentials credentials = new UserCredentials(username, password); + return new SimpleMongoDbFactory(mongo, database, credentials, authDatabase); + } + return new SimpleMongoDbFactory(mongo, database); + } + + @Bean + @ConditionalOnMissingBean + public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, + MongoConverter converter) throws UnknownHostException { + return new MongoTemplate(mongoDbFactory, converter); + } + + @Bean + @ConditionalOnMissingBean(MongoConverter.class) + public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, + MongoMappingContext context, BeanFactory beanFactory) { + DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); + MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, + context); + try { + mappingConverter.setCustomConversions(beanFactory + .getBean(CustomConversions.class)); + } + catch (NoSuchBeanDefinitionException ex) { + // Ignore + } + return mappingConverter; } @Bean @ConditionalOnMissingBean - public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory) - throws UnknownHostException { - return new MongoTemplate(mongoDbFactory); + public MongoMappingContext mongoMappingContext() { + return new MongoMappingContext(); } @Bean diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java index 5556e06b4d9..3f1e5c17937 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java @@ -47,6 +47,8 @@ public class MongoProperties { private String database; + private String authenticationDatabase; + private String gridFsDatabase; private String username; @@ -69,6 +71,14 @@ public class MongoProperties { this.database = database; } + public String getAuthenticationDatabase() { + return this.authenticationDatabase; + } + + public void setAuthenticationDatabase(String authenticationDatabase) { + this.authenticationDatabase = authenticationDatabase; + } + public String getUsername() { return this.username; } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java index 2f01433290f..30e827f4fa9 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java @@ -16,15 +16,24 @@ package org.springframework.boot.autoconfigure.mongo; +import java.util.Arrays; + import org.junit.After; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.convert.CustomConversions; import org.springframework.data.mongodb.gridfs.GridFsTemplate; +import com.mongodb.Mongo; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * Tests for {@link MongoDataAutoConfiguration}. @@ -61,4 +70,34 @@ public class MongoDataAutoConfigurationTests { assertEquals(1, this.context.getBeanNamesForType(GridFsTemplate.class).length); } + @Test + public void customConversions() throws Exception { + this.context = new AnnotationConfigApplicationContext(); + this.context.register(CustomConversionsConfig.class); + this.context.register(PropertyPlaceholderAutoConfiguration.class, + MongoAutoConfiguration.class, MongoDataAutoConfiguration.class); + this.context.refresh(); + MongoTemplate template = this.context.getBean(MongoTemplate.class); + assertTrue(template.getConverter().getConversionService() + .canConvert(Mongo.class, Boolean.class)); + } + + @Configuration + static class CustomConversionsConfig { + + @Bean + public CustomConversions customConversions() { + return new CustomConversions(Arrays.asList(new MyConverter())); + } + + } + + private static class MyConverter implements Converter { + + @Override + public Boolean convert(Mongo source) { + return null; + } + + } } diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 2905a46b28c..b36d72e92fa 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -220,6 +220,11 @@ content into your application; rather pick only the properties that you need. spring.data.mongodb.host= # the db host spring.data.mongodb.port=27017 # the connection port (defaults to 27107) spring.data.mongodb.uri=mongodb://localhost/test # connection URL + spring.data.mongodb.database= + spring.data.mongodb.authentication-database= + spring.data.mongodb.grid-fs-database= + spring.data.mongodb.username= + spring.data.mongodb.password= spring.data.mongo.repositories.enabled=true # if spring data repository support is enabled # JPA ({sc-spring-boot-autoconfigure}/orm/jpa/JpaBaseConfiguration.{sc-ext}[JpaBaseConfiguration], {sc-spring-boot-autoconfigure}/orm/jpa/HibernateJpaAutoConfiguration.{sc-ext}[HibernateJpaAutoConfiguration]) diff --git a/spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore b/spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/spring-boot-samples/spring-boot-sample-traditional/.gitignore b/spring-boot-samples/spring-boot-sample-traditional/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-traditional/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/spring-boot-samples/spring-boot-sample-web-jsp/.gitignore b/spring-boot-samples/spring-boot-sample-web-jsp/.gitignore new file mode 100644 index 00000000000..b83d22266ac --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-web-jsp/.gitignore @@ -0,0 +1 @@ +/target/