Browse Source

Improve MongoDataAutoConfiguration

Update MongoDataAutoConfiguration to provide easier configuration of
CustomConversions, the MappingMongoConverter, MongoMappingContext
and an authentication database.

Fixes gh-1619
Fixes gh-1730
pull/1979/head
Phillip Webb 11 years ago
parent
commit
670ba33bec
  1. 50
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java
  2. 10
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java
  3. 39
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java
  4. 5
      spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc
  5. 1
      spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore
  6. 1
      spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore
  7. 1
      spring-boot-samples/spring-boot-sample-traditional/.gitignore
  8. 1
      spring-boot-samples/spring-boot-sample-web-jsp/.gitignore

50
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.java

@ -18,6 +18,8 @@ package org.springframework.boot.autoconfigure.mongo; @@ -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; @@ -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; @@ -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 { @@ -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

10
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java

@ -47,6 +47,8 @@ public class MongoProperties { @@ -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 { @@ -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;
}

39
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfigurationTests.java

@ -16,15 +16,24 @@ @@ -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 { @@ -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<Mongo, Boolean> {
@Override
public Boolean convert(Mongo source) {
return null;
}
}
}

5
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. @@ -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])

1
spring-boot-samples/spring-boot-sample-tomcat-jsp/.gitignore vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
/target/

1
spring-boot-samples/spring-boot-sample-tomcat7-jsp/.gitignore vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
/target/

1
spring-boot-samples/spring-boot-sample-traditional/.gitignore vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
/target/

1
spring-boot-samples/spring-boot-sample-web-jsp/.gitignore vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
/target/
Loading…
Cancel
Save