2014-06-26 2 views
2

Dans cette petite application, j'ai utilisé l'annotation @Autowired avec l'annotation @Qualifier pour configurer les dépendances, mais une exception est levée comme mentionné ci-dessous.Pourquoi NoUniqueBeanDefinitionException: Aucun bean qualificatif de type n'est défini: haricot correspondant unique attendu mais trouvé 2

Pizaa classe

public class Pizza { 

    private Address deliverydest; 

    @Autowired 
    @Qualifier("ForPizza") 
    public void setDeliverydest(Address deliverydest) { 
     this.deliverydest = deliverydest; 
    } 
} 

Contexte Spring Configuration

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 

    <bean id="pizza" class="com.test.Shopping.Pizza" /> 

    <bean id="Cust1Address" class="com.test.Shopping.Address" /> 

    <bean id="dest1" class="com.test.Shopping.Address" > 
     <qualifier value="ForPizza" /> 
     <property name="buildingno" value="flat1/door2" /> 
    </bean> 

    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 

</beans> 

L'exception est lancée

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pizza': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.test.Shopping.Pizza.setDeliverydest(com.test.Shopping.Address); nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.test.Shopping.Address] is defined: expected single matching bean but found 2: Cust1Address,dest1 

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void com.test.Shopping.Pizza.setDeliverydest(com.test.Shopping.Address); nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.test.Shopping.Address] is defined: expected single matching bean but found 2: Cust1Address,dest1 

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.test.Shopping.Address] is defined: expected single matching bean but found 2: Cust1Address,dest1 

.

Maintenant, pourquoi le printemps n'envisage pas l'annotation @Qualifier pour trouver la fève correcte dest1 ayant qualifié value="ForPizza"?

+1

Parce que le 'AutowiredAnnotationBeanPostProcessor' ne connaît pas le' @ Qualification' annotation. Utilisez '' ro si vous voulez vraiment configurer explicitement les parseurs ajoutez un 'CustomAutowireConfigurer' pour activer la détection de' @ Qualifier'. –

+0

@Deinum, son étrange bcoz je suivais un tutoriel dans ce [link] (http://youtu.be/IVIhVJJGo68), et ça a marché là-bas. –

Répondre

3

Essayez d'ajouter les éléments suivants à votre configuration Spring:

<context:annotation-config/> 
<context:component-scan base-package="com.test.Shopping"/> 
+0

nah! même exception. De toute façon j'ai déjà ajouté annotation.AutowiredAnnotationBeanPostProcessor –

+0

après cette modification, maintenant l'exception a changé en 'Causé par: org.springframework.beans.factory.NoSuchBeanDefinitionException: Aucun bean qualifiant de type [com.test.Shopping.Address] trouvé pour la dépendance: attendu au moins 1 bean qui se qualifie comme candidat autowire pour cette dépendance. Annotations de dépendance: {} ' –

+0

Désolé mes mauvaises, vos deux modifications ont réellement fonctionné. il y avait une petite faute de frappe dans la configuration –

1

Essayez de placer @Qualifier sur le paramètre plutôt que sur la méthode:

@Autowired 
public void setDeliverydest(@Qualifier("ForPizza") Address deliverydest) { ... } 
Questions connexes