2014-06-12 7 views
3

저는 봄에 익숙하지 않고 여러분의 모든 도움을 원했습니다. "예상 단일 일치 bean을 실행했지만 두 가지를 발견했습니다"예외입니다. 나는 해결책을 찾고 그 해결책을 이해했다고 생각한다. 대부분의 솔루션은 @Qualifier를 사용하여이 예외를 해결할 것을 제안합니다. 그러나 나는 그것이 내 문제를 해결할 것이라고 생각하지 않습니다.Spring @Autowire with Inheritance

abstract class A{ 

    @Autowired 
    Client client;      

    protected void doSomething(){ 
     /* ....some code .... */ 
     client.someStuff(); 
     /* ....some code .... */ 
    } 

    /* ..... few abstract methods ......... */ 
} 

class B extends A{ 
    public void action(){ doSomething() } 
} 

class C extends A{ 
    public void action(){ doSomething() } 
} 

내 .XML의 confirugration 파일이

<bean id="authClientA" class="com.xyz.Client"> 
     <property name="auth" value="abc"> 
    </bean> 


    <bean id="authClientB" class="com.xyz.Client"> 
     <property name="auth" value="xyz"> 
    </bean> 

    <bean id="beanA" class="ClassA"> 
     <property name="client" ref="authClientA"> 
    </bean> 

    <bean id="beanB" class="ClassB"> 
     <property name="auth" ref="authClientB"> 
    </bean> 

그래서 기본적으로, 나는 두 서브 클래스에 공통 될 것입니다 방법이있는 추상 클래스를 가지고 있습니다 : 다음은 내 클래스 계층 구조입니다. 이 메소드는 클라이언트 참조를 사용하지만 런타임에 다른 객체를 사용합니다. doSomething()은 서브 클래스에서 대체되지 않습니다.

그래서이 코드를 실행하려고하면 클라이언트 참조 예외가 발생합니다. @Qualifier는 매개 변수로 .xml에서 bean 이름을 지정해야하기 때문에 @Qualifier를 사용할 수 없다고 생각합니다. 그러나 'client'속성은 공통이므로 하나의 bean 이름 만 사용할 수 없습니다.

주위를 둘러 볼 방법이 있는지 설명 할 수있는 사람이 있습니까? doSomething() 메서드를 복제하면 상속의 목적이 모두 상실되며 클래스간에 중복 코드가 생성됩니다. 컴파일시에 doSomething() 메소드에 알려지지 않을 것이므로 서브 클래스에 client 속성을 가질 수 없습니다.

아이디어/제안/솔루션이 도움이 될 것입니다. 사전 :

+2

: 더 이해하려면, 여기이 답변을 확인하시기 바랍니다 또한

abstract class A{ @Qualifier("clientA") Client clientA; @Qualifier("clientB") Client clientB; protected void doSomething(){ /* ....some code .... */ client.someStuff(); /* HERE YOU NEED SOME LOGIC TO INVOKCE THE CORRECT OBJECT METHOD */ /* ....some code .... */ } /* ..... few abstract methods * ........./ } 

을 이 빈들에 XML 설정을 사용하고 있다면 @ Autowired를 사용하는 이유는 무엇인가? 단지 '속성'을 직접 지정하십시오. –

답변

0

@Qualifier에서

덕분에 당신은 아마 그것을 사용 할 수없는 옵션이다.

당신의 XML 수정 :

<bean id="authClientA" class="com.xyz.Client"> 
    <property name="auth" value="abc"> 
    <qualifier value="clientA" /> 
</bean> 


<bean id="authClientB" class="com.xyz.Client"> 
    <property name="auth" value="xyz"> 
    <qualifier value="clientB" /> 
</bean> 

<bean id="beanA" class="ClassA"> 
    <property name="client" ref="authClientA"> 
</bean> 

<bean id="beanB" class="ClassB"> 
    <property name="auth" ref="authClientB"> 
</bean> 

을 그리고 당신의 클래스 수정 :

Spring Autowire Annotation on Abstract class: No unique bean is defined