programing

스프링 부트 2.1에서 Data Source bean 덮어쓰기

cafebook 2023. 2. 22. 23:12
반응형

스프링 부트 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

반응형