2013-04-08 4 views
3

웹 서비스에 대한 작업 호출이 있습니다.Spring Bean을 하위 클래스로 바꿀 때 오류가 발생했습니다.

테스트 목적으로
@ManagedResource(objectName = "bean:name=XServiceMBean") 
@Service("xService") 
public class XServiceImpl implements XService 
{ 
// working code here 
} 

, 나는이 클래스를 확장하고 대신 하나의 서브 클래스를 삽입하고 싶은, 그래서 만든 : 우리는 주석으로 구성된 봄 콩 웹 서비스를 호출하는 로직을 구현

@ManagedResource(objectName = "bean:name=XServiceMBean") 
@Service("xService") 
public class XServiceImplTest extends XServiceImpl 
{ 
// working code here 
} 

및 수퍼 클래스의 두 주석 행을 주석 처리했습니다.

봄 좋아하지 않아요. 내가 실행할 때 내가 얻을 :

Error creating bean with name 'xService':Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xService' must be of type [com.hsc.correspondence.rules.XService], but was actually of type [com.hsc.correspondence.rules.impl.XServiceImplTest] 

내가 다시 같은 결과로, 내 서브 클래스에하는 Xservice를 구현 "명시 적 퍼팅 시도

내가 봄에 불법적 인 일을하고 있습니까 는 원래 XServiceImpl가있다 .? @Resource 주석의 개수가 중요하다고 생각하지 않았고 이전에했던 것처럼 주입 할 것으로 예상했습니다.

테스트 할 수있는 방법이 있습니까? 클래스는 원본에 대한 절대적인 최소화 된 변경 사항을 가지고 있습니까? (필자가 진행중인 프로젝트에서 이러한 결정을 내리지 만 제외하고는 XML로 구성하는 것이 좋습니다. 내가하려는 일이 중요 할 거라고 생각하지 않았어.


추가 당황 : 오류 메시지가 "콩 유형 ...하는 Xservice이어야합니다 '하는 Xservice을'이라는, 실제로 형 XServiceImplTest의했다"말했다. 그러나 XServiceImplTest는 XServiceImpl처럼 XService를 구현합니다.

추가 퍼즐 # 2 : 전체 XServiceImpl을 클래스 XServiceImplTest에 복사하고, XServiceImpl에서 주석을 주석 처리하고, 정리하고 다시 작성하여 실행했습니다. 같은 결과가 나왔습니다. 이제 두 클래스의 유일한 차이점은 클래스 이름입니다. 그것은 낯선 사람과 낯선 사람이됩니다. 누구나 스프링이 클래스 이름이 무엇인지 신경 쓸 수 있다고 제안 할 수 있습니까?

+0

추가 퍼즐 # 2 ... XServiceImplTest 클래스에서 "extends XServiceImpl"을 제거 했습니까? – fmodos

+0

예, 확인해 주셔서 감사합니다. – arcy

답변

0

동일한 이름을 사용할 수 없습니다. 두 클래스 모두에게 "xService"를 호출합니다. 하위 클래스에 "xServiceTest"라는 다른 이름을 붙이고 @Qualifier를 사용하여 주입 할 수 있습니다. 다른 것, 나는 100 % 확신 할 수는 없지만 이런 종류의 상속에 문제가있을 수 있다고 생각합니다. 그렇다면 모든 공통 구현을 가진 추상 클래스를 만든 다음 서비스와 테스트라는 두 개의 하위 클래스를 만듭니다.

희망이 도움이됩니다.

[업데이트]

봄이 클래스 이름이 무엇인지 신경 이유

사람이 제안 할 수 있습니다?

구성에 이상한 context:component-scan 항목이 있는지 확인할 수 있습니다. 다음과 같이 정의했는지 확인하십시오.

<context:component-scan resource-pattern="<path>/*Impl.class" ...> 

및/또는 일부 특정 포함/제외 기준.

+0

OP는 원본 수업에서 특수 효과를 삭제했다고 주장했습니다. –

+0

내가 말했듯이, 한 세트의 주석을 주석 처리 했으므로 각각의 경우에 하나의 클래스에만 "xService"이름이 있습니다. "이런 상속"이 무슨 뜻인지 모르겠지만 기능을 다른 클래스로 옮길 수는 없습니다. 나는 또한 테스트 서브 클래스를 생성하기위한 유일한 목적으로 추상 클래스를 생성하지 않을 것이다. – arcy

+0

죄송합니다 ... 그 문장을 놓쳤습니다 ... – JoGo

1

나는이 세 가지 가능한 원인을 참조하십시오

  1. 귀하의 코드가 보여주는하는 일처럼 보이지 않으며, 상속 계층 구조가 없다. (당신이 인터페이스를 직접 추가했다고 말했기 때문에, 수입은 다시 확인하고 싶을 것입니다.)

  2. classpath에 오래된 컴파일 된 클래스가 있습니다. XServiceImplTest 주변에 오래된 컴파일 된 버전이 있으면이 파일이 선택 될 수 있습니다. 모든 클래스/대상 폴더를 지운다.

  3. 어떤 종류의 클래스 로더 문제로 실행 중이며 인터페이스가 테스트 구현과 다른 클래스 로더에 의해로드됩니다. 실행이 발생한 행에 중단 점을 넣고 관련된 여러 클래스의 클래스 로더를 검사합니다.

    관심있는 모든 인스턴스에서 x.getClass().getClassLoader()을 수행하면됩니다. 일반 바닐라 애플리케이션에서는 모든 x에 대해 동일한 인스턴스를 반환합니다. OSGI 응용 프로그램과 웹 응용 프로그램에서 다른 ClassLoader를 얻을 수 있습니다. ClassLoader의 유형과 상위 관계 선박은 진행중인 작업에 대한 힌트를 제공해야합니다.

+0

1. @Override를 사용하고, 두 번째 인스턴스에서 수퍼 클래스에만 메소드가있는 인터페이스를 구현합니다. 2. 매번 빌드하기 전에 물건을 정리해라. 내가 전에 실수했던 것은 틀림 없다. 3. 자바를 사용하는 것만큼이나 경험할 수있는 "다양한 클래스의 클래스 로더"를 어디에서 찾을 지 모른다. 그것에 대한 튜토리얼을 가르쳐 주시면, 어떻게해야하는지 알게 될 것 같습니다. 나는 또한 그것이 문제라고 생각하지 않는다. 그것은 원래 impl 클래스를 잘 처리하고 패키지 메이트 하위 클래스 인 – arcy

+0

이 아닌 다른 클래스 로더에 의해로드 될 염려가 없습니다. 내 대답이 업데이트되었습니다. –

관련 문제