2012-11-02 4 views
0

나는 빈 설정을 이 오류 :이 @Inject와 자동으로 묶어 = "byType와"와 함께 @Qualifier 사용할 수 없습니다

No unique bean of type [CustomerManager] is defined: expected single matching bean but found 2

당신이 볼 수 있듯이, I'v는 @Q 만 @Qualifier, @Ressource과 함께 여러 조합 (@Inject를 시도 ualifier)하지만이 오류 메시지를 제거하지 않습니다.

스프링의 깊이에 따라 @Qualifier can be used along with @Inject. 빈 설정에서 autowire = "byType"을 정의하면 함께 사용할 수 없습니까?

그리고 그것은 유형에 의해 autowire하기 위해 시도하는 말이, 동시에 이름을 지정하지 않는 <context:annotation-config /> 또는 <context:component-scan />

답변

0

를 사용하지 마십시오. 하나의 방법을 선택하십시오.

+0

, 그건. 'autowire' 속성은 각 속성에 대해 덮어 쓸 수있는 기본값만을 지정합니다. –

1

동일한 유형의 빈이 여러 개있는 경우 '@Inject'와 '@Qualifier'의 조합을 사용할 수 있어야합니다. 여기를 구성하는 방법입니다 - 측면에,

public class PostLoginUpdater implements PostLoginStatePersonalizer { 

    @Inject 
    @Qualifier("first") 
    private CustomerManager customerManager; 

    public void setCustomerManager(CustomerManager customerManager) 
    { 
     this.customerManager = customerManager; 
    } 
} 

또한 - 위와 같이 당신이 조각은 주입을 위해 다음과 같이 사용할 수, 유형 'CustomerManager'의 두 콩이 있다면

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" /> 
<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" > 
    <qualifier>first</qualifier> 
</bean> 
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" > 
    <qualifier>second</qualifier> 
</bean> 

참고 -

콩을 다른 콩보다 자주 사용하는 경우 '기본'속성을 사용할 수 있습니다.

예를 들어 위의 예에서 항상 'firstManager'를 사용하는 경향이있는 경우 아래에 표시된 것처럼 기본으로 표시 할 수 있습니다. 당신이 구성 위의 경우

<bean id="PostLoginUpdater" class="xyz.auth.PostLoginUpdater" autowire="byType" /> 
    <bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" primary="true" > 
    </bean> 
    <bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" > 
     <qualifier>second</qualifier> 
    </bean> 

다음 코드는 항상 규정자가 사용되지 않을 때 'firstManager'을 주입합니다 -

또한 @와 함께 @Qualifier 사용하려고 과거에 문제가 있었다
public class PostLoginUpdater implements PostLoginStatePersonalizer { 

    @Inject 
    private CustomerManager customerManager; 

    public void setCustomerManager(CustomerManager customerManager) 
    { 
     this.customerManager = customerManager; 
    } 
} 
+0

불행히도 그것이 작동하지 않았습니다. 그리고 ''은 필요하지 않습니다. [SpringDoc] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers) . 나는 지난 며칠 동안 autowiring에 너무 많은 문제를 직면하면서 속성을 명시 적으로 주입 할 것입니다. – GarfieldKlon

0

주사. 다음 제안 된 사용이 명시 적으로 @를 통해 구성 요소를 이름을 지정하는 것입니다 스프링 프레임 워크를 사용하는 경우

org.springframework.beans.factory.annotation.Qualifier 
javax.inject.Qualifier 

, 그러나 : 한 가지주의 할 점은 이름을 가진 두 개의 주석, 자바 봄 하나 하나가 있다는 것입니다 Component 또는 @Named [@Component ("beanName")] (주석이 달린 경우) 또는 <bean> 정의에 있습니다. autowiring은 클래스 이름이 아니라 bean 이름을 원한다는 것을 알아 두십시오 (예 : "CustomerManager"를 사용하지 마십시오). 당신이 Sashi의 예에서와 같이 두 개의 bean 정의를 가지고 예를 들어, :

<bean id="firstManager" class="xyz.manager.CustomerManager" autowire="byType" > 
    <qualifier>first</qualifier> 
</bean> 
<bean id="secondManager" class="xyz.manager.CustomerManager" autowire="byType" > 
    <qualifier>second</qualifier> 
</bean> 

는 다음과 같이 필드를 선언 : 물론, 너무 제한하는 것

@Inject 
@Qualifier("firstManager") 
private CustomerManager customerManager; 
+0

다른 주석 (here) (http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/)과 함께 @Qualifier를 사용하기위한 또 다른 좋은 스프링 참조입니다. – pmhargis