스프링 부트 2.1에서 Data Source bean 덮어쓰기
spring boot 2.1 릴리즈로 업그레이드하여 어플리케이션 부팅 시 이상한 예외가 발생하였습니다.
클래스 경로 리소스 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$]에 정의된 BeanDefinition에 정의된 콩 'dataSource'입니다.Hikari.class]를 등록할 수 없습니다.클래스 경로 리소스 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$]에 해당 이름의 콩이 이미 정의되어 있습니다.Hikari.class] 및 덮어쓰기는 디세이블입니다.
전체 오류 메시지는 다음과 같습니다.
[OS.B.W.S.C.]AnnotationConfigServletWebServerApplicationContext] 컨텍스트 초기화 중 예외가 발생했습니다.새로고침 시도 취소: org.springframework.콩류.지지하다.Bean Definition Override(빈 정의 오버라이드)예외:클래스 경로 리소스 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$]에 정의된 BeanDefinition에 이름이 '데이터 원본'인 콩 정의가 잘못되었습니다.Hikari.class] :빈 정의 [Root bean: class [org.springframework.aop.scope]를 등록할 수 없습니다.ScopedProxyFactoryBean], scope=, abstract=false, lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=factoryMethodName=factory; destroyMethodName=facebook; 클래스 경로 리소스에 정의된 BeanDefinition에 정의되어 있습니다. [or/swrameFrameFrame/autoBoot/aute/autoboot/auteboot]Hikari.class](빈 '데이터 소스'용):[Root bean: class [false]; scope=false; abstract=false; lazy가 이미 있습니다.Init=false, autowireMode=3, dependencyCheck=0, autowireCandidate=false, primary=false, factoryBeanName=factory.springframework.boot.autoconfigure.jdbc.Data Source Configuration $Hikari; factoryMethodName=데이터소스; initMethodName=displain; destroyMethodName=(inferred), 클래스 경로 리소스 [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$]에 정의되어 있습니다.Hikari.class]행.
Bean은 정책에 따라 덮어쓰지 않아야 하며 다음과 같이 비활성화되어 있습니다.
spring.main.allow-bean-definition-overriding=false
애플리케이션 코드에 데이터 소스 구성이 없습니다.이 에러를 일으키는 유일한 옵션은,@EnableAutoConfiguration
애플리케이션 속성에서 데이터 소스 유형을 다음과 같이 설정했습니다.
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
부트 어플리케이션은 다음과 같이 초기화됩니다.
@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new MyApplication()
.configure(new SpringApplicationBuilder(MyApplication.class))
.run(args);
}
}
다른 다양한 설정을 Import하는 컨피규레이션클래스도 있어요
@Configuration
@ImportResource(locations = {
"classpath*:conf/spring/*.xml",
"classpath*:conf/spring/core/*.xml",
"classpath*:conf/spring/plugin/**/*.xml"
})
@EnableAsync
@EnableRetry
@EnableCaching
@EnableBatchProcessing
@EnableCircuitBreaker
public class AppConfig {
...
}
이 문제의 원인 및 검색처를 알고 있는 사람이 있습니까?
Spring Boot 2.1 이전(2.0.5)에서는 발생하지 않았습니다.
오늘 이와 유사한 문제가 발생했는데, 다음 봄 클라우드 구성 문제가 도움이 되었습니다.제 1142호
Spring Cloud Config는 아직 Spring Boot 2.1.0과 호환되지 않습니다.Spring Cloud의 Greenwich 릴리즈 트레인은 Spring Boot 2.1.0과 호환됩니다.
의 ★★★★★★★★★★★★★★★★★.@EnableCircuitBreaker
스프링 부트 2.1.0 스프링 클라우드
application.properties에 다음 속성을 추가하면 문제가 해결됩니다.
spring.main.allow-bean-definition-distining=true
또한 언급된 다른 문제를 해결하려면 다른 속성을 추가해야 할 수 있습니다.https://github.com/openzipkin/zipkin/issues/2043
management.displaces를 클릭합니다.web.server.auto-time-display=false
비슷한 문제가 발생했습니다만, 매우 범용적입니다(때로는 주석이 중복되는 경우도 있습니다).@EnableJpaRepository와 같은 주석이 중복된 경우 오류 메시지에 해당 주석이 전혀 언급되지 않습니다.문제의 위치를 찾는 가장 좋은 방법은 다음과 같습니다.
DefaultListableBeanFactory 클래스를 엽니다.다음과 같은 코드가 있어야 합니다.
BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
if (!this.isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
새것을 던질 때 브레이크포인트를 넣으세요.다음으로 existing Definition.source.className은 이미 등록된 구성을 가리키고 있으며 여기에 문제가 있습니다.beanDefinition을 확인하는 경우.source.class 이름 두 클래스를 비교하여 중복된 코드 또는 주석 위치를 찾습니다.삭제/수정만 하면 됩니다.
Spring Boot 2+의 경우 자동 구성을 제외할 수 있습니다.
@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
public class YourApplication {
... }
프로젝트에서 Redis를 설정하려고 할 때 이 문제가 발생했는데, 최종적으로 다음을 사용하여 해결했습니다.
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
Spring Boot 2.4.2 사용
org.springframework.cloud:스프링 클라우드 컨텍스트:2.0.2.RELEASE
RefreshAutoConfiguration에서 HikariDatasource를 새로 고칠 때 이 문제가 발생합니다.
생각할 수 있는 해결책은
spring.cloud.refresh.enabled = false
저도 같은 문제가 있어서 더 나은 일반적인 해결책을 찾고 있었는데, 다음 사항을 발견했습니다.
1- 사용 중인 부팅 버전의 스프링 클라우드와 호환되는 스프링 클라우드 버전을 보려면 여기를 클릭하십시오.
2 - 그런 다음 여기를 방문하여 봄 클라우드 릴리즈에 맞는 버전을 선택하십시오.
이러한 순서로, 다른 설정 순서를 실시하지 않고 문제를 해결할 수 있었습니다.그러나 당신에게는 또 다른 비호환 의존관계가 될 수 있습니다.봄 구름일 필요는 없습니다.
언급URL : https://stackoverflow.com/questions/53104697/datasource-bean-overriding-in-spring-boot-2-1
'programing' 카테고리의 다른 글
구조체에 대한 JSON 문자열 구문 분석 방법 (0) | 2023.02.22 |
---|---|
pymongo.pymongo.pymongo.matCursorNotFound: 커서 ID '...'이(가) 서버에서 유효하지 않습니다. (0) | 2023.02.22 |
AJP 커넥터가 secretRequired="true"로 구성되어 있지만 2.2.5로 업그레이드한 후 비밀 속성이 null 또는 ""입니다. (0) | 2023.02.22 |
암호화된 워드프레스 관리자 암호를 해독하는 방법 (0) | 2023.02.22 |
반응 - "localStorage is not defined" 오류가 표시됨 (0) | 2023.02.22 |