有没有人尝试在Spring Boot时禁用mongodb的自动配置?
我正在尝试使用spring-data-mongodb进行spring-boot; 使用基于Java的配置;使用spring-boot 1.2.1.RELEASE,我导入spring-boot-starter-web及其父pom进行依赖项管理。我还导入了spring-data- mongodb(也尝试过spring-boot-starter-mongodb)。
我需要连接到两个不同的MongoDB服务器。因此,我需要为mongo连接,MongoTemplate等配置两组实例。 我也想禁用自动配置。 由于我要连接到多个服务器,因此不需要自动配置一个默认的MongoTemplate和GridFsTemplate bean。
我的主班看起来像这样:
@Configuration @EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) @ComponentScan //@SpringBootApplication // @Configuration @EnableAutoConfiguration @ComponentScan public class MainRunner { public static void main(String[] args) { SpringApplication.run(MainRunner.class, args); } }
我的两个mongo配置类如下所示:
@Configuration @EnableMongoRepositories(basePackageClasses = {Test1Repository.class}, mongoTemplateRef = "template1", includeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Test1Repository")} ) public class Mongo1Config { @Bean public Mongo mongo1() throws UnknownHostException { return new Mongo("localhost", 27017); } @Primary @Bean public MongoDbFactory mongoDbFactory1() throws UnknownHostException { return new SimpleMongoDbFactory(mongo1(), "test1"); } @Primary @Bean public MongoTemplate template1() throws UnknownHostException { return new MongoTemplate(mongoDbFactory1()); } }
和
@Configuration @EnableMongoRepositories(basePackageClasses = {Test2Repository.class}, mongoTemplateRef = "template2", includeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Test2Repository")} ) public class Mongo2Config { @Bean public Mongo mongo2() throws UnknownHostException { return new Mongo("localhost", 27017); } @Bean public MongoDbFactory mongoDbFactory2() throws UnknownHostException { return new SimpleMongoDbFactory(mongo2(), "test2"); } @Bean public MongoTemplate template2() throws UnknownHostException { return new MongoTemplate(mongoDbFactory2()); } }
通过此设置,一切正常。如果我从mongoDbFactory1和template1 bean中删除@Primary批注,则应用程序将失败,并出现一个似乎尚未禁用自动配置的异常。下面列出了异常消息:
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) at org.springframework.boot.SpringApplication.run(SpringApplication.java:961) at org.springframework.boot.SpringApplication.run(SpringApplication.java:950) at com.fourexpand.buzz.web.api.template.MainRunner.main(MainRunner.java:26) Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:98) at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:75) at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:378) at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:155) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:157) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ... 7 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.core.io.ResourceLoader org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.resourceLoader; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gridFsTemplate' defined in class path resource [org/springframework/boot/autoconfigure/mongo/MongoDataAutoConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.springframework.data.mongodb.MongoDbFactory]: : No qualifying bean of type [org.springframework.data.mongodb.MongoDbFactory] is defined: expected single matching bean but found 2: mongoDbFactory2,mongoDbFactory1; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.data.mongodb.MongoDbFactory] is defined: expected single matching bean but found 2: mongoDbFactory2,mongoDbFactory1
正如安迪·威尔金森(Andy Wilkinson)在评论中指出的那样,在将EnableAutoConfiguration与exclude list一起使用时,请确保没有其他使用EnableAutoConfiguration或SpringBootApplication注释的类。