2012-07-31 3 views
3

저는 Spring 2.5.4를 사용 중이며 Weblogic에 배포 할 Java 응용 프로그램을 작성 중입니다.어노테이션으로 지정된 bean 이름이 기존의 호환되지 않는 bean 정의와 충돌합니다.

내 코드에서 사용하려는 외부 라이브러리 (내 응용 프로그램의 결과 WAR 파일의 WEB-INF/classes 디렉토리에 포함)에 클래스가 있습니다. 내 코드에서 클래스의 객체에 대한 인스턴스 변수를 만들고 @Autowired 주석과 getter 및 setter를 추가했습니다. 내 응용 프로그램의 컨텍스트 파일에서 나는 라이브러리 클래스의 타입의 빈을 선언 한 다음 추가 : 클래스를 검색하고 주석을 처리 할 것 AutowiredAnnotationBeanPostProcessor를 등록하기 위해 ...

<context:annotation-config /> 
<context:component-scan base-package="com.mycompany" /> 

합니다. 나는 시도하고 응용 프로그램을 배포 할 때

, 나는 다음과 같은 오류 얻을 :

java.lang.IllegalStateException: Annotation-specified bean name 'myBean' for bean 
class [com.mycompany.package.ClassName] conflicts with existing, non-compatible 
bean definition of same name and class [com.mycompany.otherPackage.ClassName] 

을 내 응용 프로그램 코드에서 하나의 같은 이름을 가진 라이브러리의 클래스 (두 클래스가 있기 때문에이 생각 '패키지 이름은 "com.mycompany"로 시작합니다). Nb. 이것은 내가 추가 한 클래스가 아니라 다른 클래스입니다. 내 응용 프로그램에서 클래스 이름을 변경하지 않고이 문제를 피할 수있는 방법이 있습니까?

어떤 도움을 주셔서 감사합니다.

답변

0

autowiring을 완전히 제거하고 응용 프로그램 컨텍스트와 getBean() 메소드를 통해 명시 적으로 참조를 작성하여 bean에 액세스하여 문제점을 수정했습니다.

+7

getBean(). Spring은 IOC 컨테이너로 사용하기위한 것입니다. 당신이하고있는 일은 IOC가 아닙니다 ... 아주 못생긴 해결책 –

0

이런 종류의 충돌을 피하려면 @qualifier를 사용해야합니다. 자세한 내용은 3.9.3 섹션을 참조하십시오.

+0

내가 제안한대로 시도했지만 동일한 오류가 발생했습니다. <콩 ID = "에서 myBean"클래스 = "myLocalClass"> : 나는 내 애플리케이션 컨텍스트 내에서 문제가있는 (로컬) 클래스의 bean 정의에 다음을 추가 한 ... and this to this class file : @Qualifier ("myLabel") – GarlicBread

+1

@Component ("myLabel")를 사용하려고하면 콩을 주석 처리하기 위해 @Component를 사용하고 있습니까? –

13

이전 질문이지만 비슷한 문제가있는 나쁜 경험의 제 2c를 던집니다. 이름이 같지만 다른 패키지에있는 2 개의 클래스가있는 경우, 실패한 Spring 컨텍스트에서 다른 클래스를 참조한 시간이 있습니까? 그렇다면 AS 캐쉬 된 파일 (일반적으로 WAR이 압축 해제 된 곳)을 정리하고 WAR를 정리하고 다시 빌드 한 다음 다시 배포하는 것이 좋습니다. 앱 서버를 다시 시작하는 것도 좋습니다. 응용 프로그램 서버와 웹 컨테이너 (Weblogic, WAS, Jboss, Tomcat)는 모두 오래된 클래스를 남겨 두는 경향이 있으며 응용 프로그램이 배포 될 때 오래된 오래된 .class 파일은 대부분의 경우 이전 참조를 통해 JVM에로드됩니다. Spring 컨텍스트 로더를 엉망으로 만든다.

일반적으로 한 패키지에서 다른 패키지로 클래스의 이름을 변경/이동하거나 패키지 이름을 동일하게 유지하면서 다른 모듈 (jar)로 옮기는 경우가 일반적인 시나리오입니다. 이 경우 AS 작업 디렉토리에 파일을 캐싱 (남은)하면 큰 문제가 발생할 수 있습니다. AS에서 작업 디렉토리를 삭제하면 문제가 완전히 해결됩니다.

+5

또한 배포하기 전에'mvn clean' 또는 유사하게 실행하는 것이 도움이 될 수 있습니다. 어쩌면 오래된 클래스 파일이 빌드면에있을 수 있습니다. – vadipp

+0

스프링 부트와 EAP 문제를 해결할 수있었습니다. 감사! – newtonrd

0

이것은 @Pavel Lechev의 답변에 대한 의견으로는 적합하지만 아직 코멘트 할 담당자가 없습니다.

다른 사람이이 문제를 해결하기 위해 내가 한 일은 다음과 같습니다. Wildfly 9.0.2.Final과 IntelliJ IDEA 2016.1.3 Build # IU-145.1617을 사용하고 있습니다. 이 단계는 JBoss에서도 잘 작동합니다.

  1. Wildfly 서버를 중지하십시오.
  2. $ WILDFLY_HOME/standalone /으로 이동하십시오. 다음 세 폴더를 삭제하십시오 : lib /, log/및 temp /.
  3. IntelliJ에서 빌드> 빌드 아티팩트> 모든 아티팩트> 클린 (또는 배포하려는 아티팩트).
  4. IntelliJ에서 빌드> 프로젝트 다시 작성
  5. Wildfly를 다시 시작하고 이슈를 재배포하십시오.

이 단계는 컨트롤러의 몇 상류 패키지 이름을 리팩토링 후 Spring 컨텍스트에서 검출 중복 빈 이름의 내 문제를 해결할.