Quelqu'un a-t-il essayé de désactiver la configuration automatique pour mongodb dans spring-boot?
J'essaie Spring-Boot avec Spring-Data-Mongodb; Utilisation de la configuration basée sur Java En utilisant spring-boot 1.2.1.RELEASE, j'importe spring-boot-starter-web et son pom parent pour la gestion des dépendances. J'importe aussi spring-data-mongodb (essayé aussi avec spring-boot-starter-mongodb).
Je dois me connecter à deux serveurs MongoDB différents. Je dois donc configurer deux ensembles d'instances pour la connexion Mongo, MongoTemplate, etc. Je souhaite également désactiver la configuration automatique. Étant donné que je me connecte à plusieurs serveurs, je n'ai pas besoin d'un seul bean MongoTemplate et d'un bean GridFsTemplate autoconfiguré par défaut.
Ma classe principale ressemble à ceci:
@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);
}
}
Mes deux classes de configuration mongo ressemblent à ceci:
@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());
}
}
et
@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());
}
}
Avec cette configuration, tout fonctionne. Si je supprime les annotations @Primary des beans mongoDbFactory1 et template1, l'application échouera avec une exception qui semble indiquer que la configuration automatique n'a pas été désactivée. Le message d'exception est répertorié ci-dessous:
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
Comme l'a souligné Andy Wilkinson dans les commentaires, lorsque vous utilisez EnableAutoConfiguration avec une liste d'exclusion, assurez-vous qu'il n'y a pas d'autres classes annotées avec EnableAutoConfiguration ou SpringBootApplication.
Voici comment je le fais:
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
Mon cas d'utilisation était légèrement différent. J'avais besoin de 2 bases de données différentes dans le même projet. J'ai étendu les classes de configuration automatique et ajouté une annotation de profil.
@Profile("mongo")
@Configuration
public class CustomMongoAutoConfiguration extends MongoAutoConfiguration {
public CustomMongoAutoConfiguration(
MongoProperties properties,
ObjectProvider<MongoClientOptions> options,
Environment environment) {
super(properties,options,environment);
}
}
Et
@Profile("mongo")
@Configuration
@EnableConfigurationProperties(MongoProperties.class)
public class CustomMongoDataAutoConfiguration extends MongoDataAutoConfiguration {
public CustomMongoDataAutoConfiguration(
ApplicationContext applicationContext,
MongoProperties properties) {
super(applicationContext,properties);
}
}
Essayez d'exécuter l'application en mode débogage. Cela se produit lorsque la configuration basée sur MongoDB tente d’instancier mais que le haricot correspondant n’est pas présent. Dans mon cas, j'ai exclu MongoDataAutoConfiguration.class et MongoRepositoriesAutoConfiguration.class pour que l'application s'exécute.
@SpringBootApplication
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoRepositoriesAutoConfiguration .class,MongoDataAutoConfiguration.class})
public class SomeApplication {
//...
}