sourcecode

주석 지정 콩 이름이 호환되지 않는 기존 콩 이름과 충돌합니다.

codebag 2023. 3. 29. 21:28
반응형

주석 지정 콩 이름이 호환되지 않는 기존 콩 이름과 충돌합니다.

스프링빈의 정의에 문제가 있습니다.main() 메서드에 의해 로드되는 콘텍스트xml 파일이 몇 개 있는데 둘 다 context: component-scan 태그를 거의 독점적으로 포함하고 있습니다.메인 메서드가 시작되면 Spring에서 다음 오류가 발생합니다.

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]

두 DAO 클래스에는 다음과 같은 주석이 붙습니다.

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}

메모리 내 dao에는 @Repository("converterDAO") 주석도 있습니다.dao는 다음과 같은 다른 클래스에서 참조됩니다.

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...

한 DAO가 다른 DAO의 정의를 덮어쓰기를 원합니다.이것은 처음부터 DI 프레임워크를 사용하는 주된 이유 중 하나입니다.xml 정의에서 수년간 이 작업을 수행했지만 문제가 없었습니다.하지만 컴포넌트 스캔과 주석이 달린 콩 정의에서는 그렇지 않습니다.그리고 '호환성이 없다'는 말은 스프링이 무엇을 의미합니까?같은 인터페이스를 실장해, 그 인터페이스 타입의 필드에 자동 접속됩니다.도대체 왜 그들은 호환되지 않는 거지?

주석이 달린 컴포넌트 스캔된 콩을 다른 콩보다 우선할 수 있는 방법을 누가 알려줄 수 있나요?

@RestController를 사용한 Spring 4.x에서도 같은 문제가 있었습니다.서로 다른 두 패키지에 같은 이름의 클래스가 있습니다...

package com.x.catalog

@RestController
public class TextureController {
...

package com.x.cms
@RestController
public class TextureController {
...

수정은 쉬웠다...

package com.x.catalog

@RestController("CatalogTextureController")
public class TextureController {
...

package com.x.cms
@RestController("CMSTextureController")
public class TextureController {
...

문제는 주석이 자동으로 연결되고 기본적으로 클래스 이름이 선택된다는 것입니다.@RestController 주석에서 명시적으로 이름을 지정하면 클래스 이름을 유지할 수 있습니다.

XML 파일에는 일련의 선언이 있으며 이전 정의를 새로운 정의로 덮어쓸 수 있습니다.주석을 사용할 때는 이전 또는 이후 개념이 없습니다.모든 콩이 같은 높이에 있다.같은 이름의 콩 두 개를 정의했는데 스프링은 어떤 것을 골라야 할지 모르겠어요.

다른 이름(를 들어 MemoryConverterDAO의 staticConverterDAO)을 지정하고 Spring XML 파일에 에일리어스(를 들어 theConverterDAO)를 생성하여 컨버터를 삽입할 때 다음 에일리어스를 사용합니다.

@Autowired @Qualifier("theConverterDAO")

한 프로젝트에 2개의 jar 라이브러리(app1과 app2)가 있는 것과 같은 문제가 있었습니다.콩 "BeanName"은 app1에서 정의되고 app2에서 확장되며 콩은 동일한 이름으로 재정의됩니다.

app1:

package com.foo.app1.pkg1;

@Component("BeanName")
public class Class1 { ... }

앱2:

package com.foo.app2.pkg2;

@Component("BeanName")
public class Class2 extends Class1 { ... }

로 인해, 「」가 발생합니다.ConflictingBeanDefinitionException 컴포넌트 bean nameapplicationContext로 시 가 발생하였습니다.

하려면 Spring 에서 " " " " 를 참조해 주세요.applicationContext.xml:

    <context:component-scan base-package="com.foo.app2.pkg2"/>
    <context:component-scan base-package="com.foo.app1.pkg1">
        <context:exclude-filter type="assignable" expression="com.foo.app1.pkg1.Class1"/>
    </context:component-scan>

따라서 Class1은 컴포넌트 검사 및 빈에 자동으로 할당되기 때문에 이름 경합을 피할 수 있습니다.

저도 비슷한 문제가 있었는데, 최근에 콩이 다른 디렉토리로 옮겨졌기 때문입니다. 클린'은 '빌드 클리어'를해서 해야 요.build/classes/java디렉토리와 문제가 사라졌습니다.(이 에러 메세지는, 실제로는 존재하지 않게 되어 있는 것을 알고 있습니다만, 2개의 다른 파일 패스가 서로 경합하고 있습니다.

경우에 따라서는, 클래스를 이동해, 오래된 클래스가 존재하지 않는 경우라도, 그 클래스가 참조할 수 있습니다.

이 경우는, 다음의 조작을 실시합니다.

mvn eclipse:clean

mvn eclipse:eclipse

이건 나한테 잘 먹혔어.

저도 같은 문제가 있었어요.이하의 순서로 해결했습니다(편집자:IntelliJ):

  1. 보기 -> 툴 윈도 -> 메이븐 프로젝트하위 창에서 프로젝트를 엽니다.
  2. 프로젝트 옆에 있는 화살표를 클릭합니다.
  3. 라이프 사이클을 클릭합니다.
  4. [ clean ]을 클릭합니다.

저도 비슷한 문제가 있었어요.저는 프로젝트를 다시 구축했고 문제는 해결되었습니다.

그 이유는 파일에 주석 지정 콩 이름에 대해 이미 정의된 시퀀스가 있기 때문입니다.이 콩 이름을 변경하고 응용 프로그램을 실행하려고 하면 스프링이 어떤 콩을 선택해야 할지 알 수 없습니다.그렇기 때문에 이 에러가 표시됩니다.

제 경우 이전 콩 클래스를 프로젝트에서 삭제하고 동일한 콩 이름을 새 콩 클래스에 추가했습니다.따라서 Spring은 파일에서 삭제된 콩 클래스에 대한 이전 정의를 가지고 있으며 컴파일 중에 새로 추가된 클래스와 충돌합니다.따라서 'build clean'을 실행하면 콩 클래스에 대한 이전 정의가 삭제되고 컴파일이 성공합니다.

다른 답변이 모두 문제를 수정하지 않고 설정을 직접 또는 간접적으로 변경한 후 문제가 발생하기 시작하고(git pull/merge/rebase를 통해), 프로젝트가 Maven 프로젝트인 경우:

mvn clean

이 오류에 대한 설명 내부 작업

인스턴스화 후 컨테이너가 클래스 이름이 다른 패키지에 관계없이 같기 때문에 두 클래스에 동일한 개체를 할당하려고 하기 때문에 이 오류가 발생합니다.따라서 에러에서 같은 이름의 호환되지 않는 bean 정의가 표시됩니다.

실제로 사내에서 동작하는 것은--->>입니다.

pkg test 1; …. @RestController 클래스 테스트 {}

pkg test 2; …. @RestController 클래스 테스트 {}

첫 번째 컨테이너는 클래스 테스트를 받고 @RestController는 이를 인스턴스화하도록 지시합니다.test = new Test(); 그러면 두 번 인스턴스화되지 않습니다. 컨테이너 인스턴스화 후 두 클래스에 모두 참조 변수 테스트(클래스 이름과 동일)를 제공하고 테스트 참조를 제공하는 동안 두 번째 클래스에는 호환되지 않는 동일한 이름의 bean 정의가 생성됩니다. …

해결책:>>>>

컨테이너가 기본 이름으로 인스턴스화되지 않도록 참조 이름을 두 개의 나머지 컨트롤러에 할당하고 동일한 이름에 관계없이 두 클래스에 대해 안전하게 인스턴스화하십시오.

예를 들어 -->>

pkg test1; …. @RestController("test1") 클래스 테스트 {}

pkg test 2; …. @RestController("test 2") 클래스 테스트 {}

주의: @Controller, @Service, @Repository 등에서도 동일하게 동작합니다.

주의: 클래스레벨에서 참조변수를 작성하는 경우에는 @Qualifier("특정 참조명")로 주석을 붙일 수도 있습니다(: @Autowired @Qualifier("test1") 테스트).

인텔리J에서도 기존 파일을 새 패키지로 옮긴 후 cleaning caché를 해결했는데, maven으로 실행하려고 했을 때 오류가 발생했습니다.다음 방법으로 해결했습니다.

cache:clean

이클립스를사용하여클래스를새로운패키지로이동하면이오류가발생합니다.에게 효과가 있었던 것은 프로젝트> 클린

또한 TomCat 서버를 마우스 오른쪽 버튼으로 클릭하고 clean을 선택하여 서버를 청소합니다.

시나리오:

저는 멀티모듈 그라들 프로젝트를 진행하고 있습니다.

모듈은 다음과 같습니다.

- core, 
- service,
- geo,
- report,
- util and
- some other modules.

따라서 주로 지역 모듈에 Component[location RecommendHttpClientBuilder]를 준비했습니다.

자바 코드:

import org.springframework.stereotype.Component

@Component("locationRecommendHttpClientBuilder")
class LocationRecommendHttpClientBuilder extends PanaromaHttpClientBuilder {
    @Override
    PanaromaHttpClient buildFromConfiguration() {
        this.setURL(PanaromaConf.getInstance().getString("locationrecommend.url"))
        this.setMethod(PanaromaConf.getInstance().getString("locationrecommend.method"))
        this.setProxyHost(PanaromaConf.getInstance().getString("locationrecommend.proxy.host"))
        this.setProxyPort(PanaromaConf.getInstance().getInt("locationrecommend.proxy.port", 0))
        return super.build()
    }
}

application-syslog.xml

<bean id="locationRecommendHttpClient"
      class="au.co.google.panaroma.platform.logic.impl.PanaromaHttpClient"
      scope="singleton" factory-bean="locationRecommendHttpClientBuilder"
      factory-method="buildFromConfiguration" />

그런 다음 컴포넌트를 코어 모듈에 추가하기로 결정했습니다.

한 엔지니어는 지리 모듈의 이전 코드를 가지고 있으며 최신 코어 모듈을 사용했지만 최신 지리 모듈을 사용하는 것을 잊었습니다.

따라서 [locationRecommendHttpClientBuilder]라는 컴포넌트가 프로젝트에서 두 번 발생했는데 다음 오류가 발생했습니다.

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'LocationRecommendHttpClientBuilder' for bean class [au.co.google.app.locationrecommendation.builder.LocationRecommendHttpClientBuilder] conflicts with existing, non-compatible bean definition of same name and class [au.co.google.panaroma.platform.logic.impl.locationRecommendHttpClientBuilder]

솔루션 절차:

지오 모듈에서 컴포넌트를 삭제하면 component[locationRecommendHttpClientBuilder]는 코어 모듈에서만 사용할 수 있습니다.그래서 충돌하는 상황은 없습니다.이 방법으로 문제를 해결합니다.

워크스페이스에 2개의 프로젝트를 Import 했을 때, 이 문제에 직면했습니다.어떻게든 다른 항아리를 만들었기 때문에 항아리와 클래스 파일을 삭제하고 의존관계를 바로 잡기 위해 프로젝트를 다시 구축할 수 있습니다.

제 경우, 같은 클래스 이름에 반영되어 있는2개의 다른 패키지에 대해 어플리케이션 pom.xml에 의존관계를 추가한 것이 문제였습니다.

pom.xml 또는 동일한 클래스의 가능한 주입점이 될 수 있는 주석을 확인합니다.

파일 jar로 서버를 구축하고 mvn clean install을 사용하면 git으로 브랜치를 변경할 수 있습니다.mvn clean 명령어를 사용해야 합니다.이 명령어는 기사에서처럼 예외를 슬로우합니다.키워드: mvn clean

Eclipse의 gradle 프로젝트를 통해 이 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/13801359/annotation-specified-bean-name-conflicts-with-existing-non-compatible-bean-def

반응형