2010-04-23 7 views
15

J'ai 2 classes (B, C) étend la classe A.problème avec Autowiring et non haricots uniques

@Service 
public class A extends AbstratClass<Modele>{ 

    @Autowired 
    A(MyClass br) { 
     super(br); 
    } 


@Service 
public class B extends A{ 

    @Autowired 
    B (MyClass br) { 
    super(br); 
    } 



@Service 
public class C extends A{ 

    @Autowired 
    C (MyClass br) { 
    super(br); 
    } 

Mais j'ai ce message:

Aucun grain unique de type [A] ] est défini: attendu haricot correspondant unique, mais trouvé 2: [A, B, moveModeleMarshaller]

Je ne peux pas vraiment obtenir pourquoi j'ai ce message & comment résoudre même après avoir lu Spring documentatio n.

Merci d'avance.

+0

je suis aussi obtenir le même problème, mais ne peux pas trouver approprié solution s'il vous plaît aidez-moi ... merci –

Répondre

4

Vous essayez (ailleurs) d'autowire un bean de type A. Quelque chose comme:

@Autowired 
private A beanA; 

Mais vous avez 2 haricots qui se conforment à cela.

Vous pouvez résoudre ce problème en utilisant @Resource et spécifiant les haricots exactement:

@Resource("b") 
private A beanA; 

(où « b » est le nom du grain injecté) ou en utilisant l'annotation @Qualifier.

14

Vous devriez réécrire votre classe à quelque chose comme ceci avec l'annotation @Qualifier.

@Service 
@Qualifier("a") 
public class A extends AbstratClass<Modele>{ 

    @Autowired 
    A(MyClass br) { 
     super(br); 
    } 


@Service 
@Qualifier("b") 
public class B extends A{ 

    @Autowired 
    B (MyClass br) { 
    super(br); 
    } 

@Service 
@Qualifier("c") 
public class C extends A{ 

    @Autowired 
    C (MyClass br) { 
    super(br); 
    } 

Vous devez également utiliser l'annotation @Qualifier sur l'instance de type A vous Autowiring la fève de printemps dans.

Quelque chose comme ceci:

public class Demo { 

    @Autowired 
    @Qualifier("a") 
    private A a; 

    @Autowired 
    @Qualifier("b") 
    private A a2; 

    public void demo(..) {..} 
} 

Si vous ne voulez pas avoir cette configuration de printemps dans votre code de production, vous devez écrire la logique d'injection de dépendance avec XML ou Java configuration à la place.

Vous pouvez également spécifier un bean par défaut de type A avec l'annotation @Primary au-dessus de l'une de vos classes de service qui étend le type A. Spring peut alors autowire sans spécifier l'annotation @Qualifier. Comme Spring ne tentera jamais de deviner quel bean injecter, vous devez spécifier lequel ou baliser l'un d'entre eux avec @Primary tant qu'il a plus d'un bean d'un type.

+1

une opinion personnelle - je préfère '@ Resource' pour les cas les plus simples. – Bozho

+0

Ce sont juste des détails mineurs, mais je préfère utiliser @Autowired ou les nouvelles annotations @Inject (JSR-330) dans tous les cas. Un inconvénient possible avec @Resource et @Inject est que vous ne les avez pas sur classpath puisqu'il ne fait pas partie de Spring. – Espen

2

En général, vous obtiendrez cette erreur lorsque défini deux haricots avec la même classe

<bean id="a" class="com.package.MyClass"/> 
<bean id="b" class="com.package.MyClass"/> 

si vous adresse les deux lignes ci-dessus, nous avons deux haricots avec la même classe.

lorsque vous essayez de lier automatiquement cette classe dans tout autre classé, vous obtiendrez ce type d'erreur

Vous avez deux solutions

Première méthode

  1. qualificatif utilisé par la définition d'un identifiant de haricot init comme ceci

    @Autowired 
    @Qualifier("a") 
    MyClass a; 
    
    @Autowired 
    @Qualifier("b") 
    MyClass b; 
    

Deuxième méthode

utilisation JSR250 api (son un fichier jar vous pouvez mettre dans votre chemin de classe

Alors n'autowriring comme ci-dessous

@Resource("a") 
MyClass a 

@Resource("b") 
MyClass a 
Questions connexes