스프링 부트에서의 spring-data-mongodb 자동 설정을 디세블로 하는 방법
스프링 부트 시 mongodb의 자동 설정을 해제해 본 적이 있습니까?
spring-data-mongodb를 사용하여 spring-boot을 시도하고 있습니다.java 기반 설정 사용.spring-boot 1.2.1 사용.RELEASE, 의존관계 관리를 위해 spring-boot-starter-web과 그 부모 폼을 Import합니다.spring-data-mongodb(spring-boot-starter-mongodb도 시험)도 Import합니다.
두 개의 다른 MongoDB 서버에 연결해야 합니다.그래서 Mongo Connection, MongoTemplate 등 2개의 인스턴스를 설정해야 합니다.자동 설정도 무효로 하고 싶습니다. 여러 서버에 접속하고 있기 때문에 기본 MongoTemplate와 GridFsTemplate bean을 1개만 자동 설정할 필요는 없습니다.
제 주요 수업은 다음과 같습니다.
@Configuration
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@ComponentScan
//@SpringBootApplication
public class MainRunner {
public static void main(String[] args) {
SpringApplication.run(MainRunner.class, args);
}
}
2개의 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 beans에서 @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
방법은 다음과 같습니다.
@SpringBootApplication(exclude = {
MongoAutoConfiguration.class,
MongoDataAutoConfiguration.class
})
또는 Dan Oak의 제안대로:
spring.autoconfigure.exclude= \
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
Andy Wilkinson이 코멘트에서 지적한 바와 같이 Enable을 사용할 때제외 목록이 포함된 자동 구성 사용으로 주석이 달린 다른 클래스가 없는지 확인합니다.자동 설정 또는 Spring Boot Application.
제 사용 사례는 조금 달랐습니다.나는 같은 프로젝트에서 두 개의 다른 데이터베이스에 대한 요구사항이 있었다.자동 설정 클래스를 확장하고 프로파일 주석을 추가했습니다.
@Profile("mongo")
@Configuration
public class CustomMongoAutoConfiguration extends MongoAutoConfiguration {
public CustomMongoAutoConfiguration(
MongoProperties properties,
ObjectProvider<MongoClientOptions> options,
Environment environment) {
super(properties,options,environment);
}
}
그리고.
@Profile("mongo")
@Configuration
@EnableConfigurationProperties(MongoProperties.class)
public class CustomMongoDataAutoConfiguration extends MongoDataAutoConfiguration {
public CustomMongoDataAutoConfiguration(
ApplicationContext applicationContext,
MongoProperties properties) {
super(applicationContext,properties);
}
}
응용 프로그램을 디버깅모드로 실행해 보겠습니다.이 문제는 MongoDB 종속 설정이 인스턴스화하려고 하지만 각각의 빈이 존재하지 않을 때 발생합니다.내 경우 Mongo Data를 제외했습니다.AutoConfiguration.class 및 MongoRepositoryAutoConfiguration.class: 응용 프로그램을 실행합니다.
@SpringBootApplication @EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoRepositoriesAutoConfiguration .class,MongoDataAutoConfiguration.class}) public class SomeApplication { //... }
스프링 부트 2.3.x:
spring.autoconfigure.exclude[0]: org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
spring.autoconfigure.exclude[1]: org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration
반응:
spring.autoconfigure.exclude[0]: org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration
spring.autoconfigure.exclude[1]: org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration
https://stackoverflow.com/a/49980868/5213837,의 스프링 부트 2.3/Kotlin과 동일
@SpringBootApplication(exclude = [MongoAutoConfiguration::class, MongoDataAutoConfiguration::class]
@Profile("mongo")
@Configuration
class CustomMongoAutoConfiguration: MongoAutoConfiguration() {
override fun mongo(
properties: MongoProperties?,
environment: Environment?,
builderCustomizers: ObjectProvider<MongoClientSettingsBuilderCustomizer>?,
settings: ObjectProvider<MongoClientSettings>?
): MongoClient {
return super.mongo(properties, environment, builderCustomizers, settings)
}
}
@Profile("mongo")
@Configuration
@EnableConfigurationProperties(MongoProperties::class)
class CustomMongoDataAutoConfiguration : MongoDataAutoConfiguration()
언급URL : https://stackoverflow.com/questions/28747909/how-to-disable-spring-data-mongodb-autoconfiguration-in-spring-boot
'prosource' 카테고리의 다른 글
Oracle에서 Views와 Materialized Views의 차이점은 무엇입니까? (0) | 2023.03.04 |
---|---|
각도로 절연 스코프 지시어를 테스트하는 방법JS (0) | 2023.03.04 |
MongoDB: 배열 필드에 요소가 포함되어 있는지 확인하는 방법 (0) | 2023.03.04 |
WooCommerce: 체크아웃 시 한 개의 주/시로 사전 선택 및 제한 (0) | 2023.03.04 |
워드프레스 데이터베이스에서 제품 속성을 가져오는 방법 (0) | 2023.03.04 |