From cf4df1befb9dd562d8a9a2ffd51fa7d136e56e9f Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 5 Feb 2014 12:20:23 +0100 Subject: [PATCH] Improve Mongo auto-configuration Disable Mongo auto-configuation when @EnableMongoRepositories is used and adapt the test helper classes accordingly. Change the property prefix and dependency management version property from `...mongo` to `...mongodb` for consistency with Spring Data. Fixes gh-315 --- .../MongoRepositoriesAutoConfiguration.java | 14 +++++---- ...ngoRepositoriesAutoConfigureRegistrar.java | 5 ++- ...JpaRepositoriesAutoConfigurationTests.java | 5 +-- ...ngoRepositoriesAutoConfigurationTests.java | 31 +++++++++++++++++-- ...Repository.java => CityJpaRepository.java} | 2 +- .../data/alt/CityMongoDbRepository.java | 24 ++++++++++++++ spring-boot-dependencies/pom.xml | 4 +-- 7 files changed, 71 insertions(+), 14 deletions(-) rename spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/{CityRepository.java => CityJpaRepository.java} (92%) create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityMongoDbRepository.java diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfiguration.java index d332fb5b937..44d495d82cc 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,21 +41,23 @@ import com.mongodb.MongoClientURI; /** * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Mongo * Repositories. - * + * * @author Dave Syer + * @author Oliver Gierke * @see EnableMongoRepositories */ @Configuration @ConditionalOnClass({ Mongo.class, MongoRepository.class }) public class MongoRepositoriesAutoConfiguration { - @Import(MongoRepositoriesAutoConfigureRegistrar.class) @Configuration + @Import(MongoRepositoriesAutoConfigureRegistrar.class) @EnableConfigurationProperties(MongoProperties.class) protected static class MongoRepositoriesConfiguration { @Autowired private MongoProperties config; + private Mongo mongo; @PreDestroy @@ -67,20 +69,20 @@ public class MongoRepositoriesAutoConfiguration { @Bean @ConditionalOnMissingBean(Mongo.class) - Mongo mongo() throws UnknownHostException { + public Mongo mongo() throws UnknownHostException { this.mongo = this.config.mongo(); return this.mongo; } @Bean @ConditionalOnMissingBean(MongoTemplate.class) - MongoTemplate mongoTemplate(Mongo mongo) throws UnknownHostException { + public MongoTemplate mongoTemplate(Mongo mongo) throws UnknownHostException { return new MongoTemplate(mongo, this.config.database()); } } - @ConfigurationProperties(name = "spring.data.mongo") + @ConfigurationProperties(name = "spring.data.mongodb") public static class MongoProperties { private String host; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigureRegistrar.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigureRegistrar.java index 28713bea286..8f4b5ff6695 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigureRegistrar.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigureRegistrar.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,9 +18,11 @@ package org.springframework.boot.autoconfigure.data; import java.lang.annotation.Annotation; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.data.mongodb.repository.config.MongoRepositoryConfigurationExtension; +import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; import org.springframework.data.repository.config.RepositoryConfigurationExtension; /** @@ -29,6 +31,7 @@ import org.springframework.data.repository.config.RepositoryConfigurationExtensi * * @author Dave Syer */ +@ConditionalOnMissingBean(MongoRepositoryFactoryBean.class) class MongoRepositoriesAutoConfigureRegistrar extends AbstractRepositoryConfigurationSourceSupport { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/JpaRepositoriesAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/JpaRepositoriesAutoConfigurationTests.java index 25824662322..856e07880d8 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/JpaRepositoriesAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/JpaRepositoriesAutoConfigurationTests.java @@ -36,6 +36,7 @@ import static org.junit.Assert.assertNotNull; * Tests for {@link JpaRepositoriesAutoConfiguration}. * * @author Dave Syer + * @author Oliver Gierke */ public class JpaRepositoriesAutoConfigurationTests { @@ -65,7 +66,7 @@ public class JpaRepositoriesAutoConfigurationTests { PropertyPlaceholderAutoConfiguration.class); this.context.refresh(); assertNotNull(this.context - .getBean(org.springframework.boot.autoconfigure.data.alt.CityRepository.class)); + .getBean(org.springframework.boot.autoconfigure.data.alt.CityJpaRepository.class)); assertNotNull(this.context.getBean(PlatformTransactionManager.class)); assertNotNull(this.context.getBean(EntityManagerFactory.class)); } @@ -77,7 +78,7 @@ public class JpaRepositoriesAutoConfigurationTests { } @Configuration - @EnableJpaRepositories(basePackageClasses = org.springframework.boot.autoconfigure.data.alt.CityRepository.class) + @EnableJpaRepositories(basePackageClasses = org.springframework.boot.autoconfigure.data.alt.CityJpaRepository.class) @TestAutoConfigurationPackage(City.class) protected static class CustomConfiguration { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigurationTests.java index 82ecd822c57..854e4fe4c5c 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/MongoRepositoriesAutoConfigurationTests.java @@ -19,19 +19,26 @@ package org.springframework.boot.autoconfigure.data; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage; +import org.springframework.boot.autoconfigure.data.alt.CityMongoDbRepository; import org.springframework.boot.autoconfigure.data.mongo.City; import org.springframework.boot.autoconfigure.data.mongo.CityRepository; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import com.mongodb.Mongo; +import com.mongodb.MongoClient; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; /** * Tests for {@link MongoRepositoriesAutoConfiguration}. * * @author Dave Syer + * @author Oliver Gierke */ public class MongoRepositoriesAutoConfigurationTests { @@ -45,7 +52,9 @@ public class MongoRepositoriesAutoConfigurationTests { PropertyPlaceholderAutoConfiguration.class); this.context.refresh(); assertNotNull(this.context.getBean(CityRepository.class)); - assertNotNull(this.context.getBean(Mongo.class)); + + Mongo mongo = this.context.getBean(Mongo.class); + assertThat(mongo, is(instanceOf(MongoClient.class))); } @Test @@ -55,7 +64,19 @@ public class MongoRepositoriesAutoConfigurationTests { MongoRepositoriesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); this.context.refresh(); - assertNotNull(this.context.getBean(Mongo.class)); + + Mongo mongo = this.context.getBean(Mongo.class); + assertThat(mongo, is(instanceOf(MongoClient.class))); + } + + @Test + public void doesNotTriggerDefaultRepositoryDetectionIfCustomized() { + this.context = new AnnotationConfigApplicationContext(); + this.context.register(CustomizedConfiguration.class, + MongoRepositoriesAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertNotNull(this.context.getBean(CityMongoDbRepository.class)); } @Configuration @@ -70,4 +91,10 @@ public class MongoRepositoriesAutoConfigurationTests { } + @Configuration + @TestAutoConfigurationPackage(MongoRepositoriesAutoConfigurationTests.class) + @EnableMongoRepositories(basePackageClasses = CityMongoDbRepository.class) + protected static class CustomizedConfiguration { + + } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityRepository.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityJpaRepository.java similarity index 92% rename from spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityRepository.java rename to spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityJpaRepository.java index 9615eb9f7af..1918fa6a4cf 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityRepository.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityJpaRepository.java @@ -19,6 +19,6 @@ package org.springframework.boot.autoconfigure.data.alt; import org.springframework.boot.autoconfigure.data.jpa.City; import org.springframework.data.repository.Repository; -public interface CityRepository extends Repository { +public interface CityJpaRepository extends Repository { } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityMongoDbRepository.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityMongoDbRepository.java new file mode 100644 index 00000000000..ab87c4c0b95 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/CityMongoDbRepository.java @@ -0,0 +1,24 @@ +/* + * Copyright 2014-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.alt; + +import org.springframework.boot.autoconfigure.data.mongo.City; +import org.springframework.data.repository.Repository; + +public interface CityMongoDbRepository extends Repository { + +} diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 8c4b3c3e0cc..e39b85f3362 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -46,7 +46,7 @@ 3.0.0.RELEASE 2.2.4.RELEASE 1.4.3.RELEASE - 1.3.3.RELEASE + 1.3.3.RELEASE 1.1.1.RELEASE 1.2.1.RELEASE 1.1.0.RELEASE @@ -469,7 +469,7 @@ org.springframework.data spring-data-mongodb - ${spring-data-mongo.version} + ${spring-data-mongodb.version} org.springframework.data