2010-04-23 10 views
15

Ich habe 2 Klassen (B, C) erstreckt Klasse A.Problem autowiring & keine eindeutige Bohne

@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); 
    } 

Aber ich habe diese Nachricht:

keine eindeutige Bohne vom Typ [A] ] definiert: Single Matching Bean erwartet gefunden, aber 2: [A, B, moveModeleMarshaller]

ich kann nicht wirklich bekommen, warum ich diese Nachricht haben & wie nach der Lektüre Frühling Dokumentatio lösen sogar n.

Vielen Dank im Voraus.

+0

ich bin auch das gleiche Problem bekommen aber kann nicht für angemessen Lösung bitte helfen Sie mir ... danke –

Antwort

4

Sie versuchen (woanders), eine Bean vom Typ A zu autowire. Etwas wie:

@Autowired 
private A beanA; 

Aber Sie haben 2 Bohnen, die diesem entsprechen.

@Resource("b") 
private A beanA; 

(wobei "b" der Name des eingespritzten Bean ist) oder die @Qualifier Anmerkung mit:

Sie können dies durch die Verwendung @Resource und Spezifizierungs die Bohne genau lösen.

14

Sie sollten Ihre Klasse in so etwas mit der @Qualifier Annotation umschreiben.

@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); 
    } 

Sie müssen auch die @Qualifier Anmerkung auf die Instanz des Typs A verwenden Sie autowiring die Spring-Bean in.

Etwas wie folgt aus:

public class Demo { 

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

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

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

Wenn Sie diese Spring-Konfiguration haben, in Ihrem Produktionscode nicht mögen, haben Sie stattdessen die Dependency Injection-Logik mit XML oder Java-Konfiguration zu schreiben.

Sie können auch eine Standard-Bean vom Typ A mit der Annotation @Primary über einer Ihrer Serviceklassen angeben, die den Typ A erweitert. Dann kann Spring ohne Angabe der @Qualifier Annotation automatisch senden.

Da Spring nie versuchen wird, welche zu injizierende Bean zu erraten, müssen Sie angeben, welche davon oder markieren Sie eine von ihnen mit @Primary so lange wie seine mehr als eine Bean eines Typs.

+1

eine persönliche Meinung - ich bevorzuge '@ Resource' für die einfacheren Fälle. – Bozho

+0

Es sind nur kleine Details, aber ich bevorzuge in jedem Fall entweder @Autowired oder die neuen @Inject (JSR-330) Annotationen. Ein möglicher Nachteil von @Resource und @Inject ist, dass Sie sie nicht im Klassenpfad haben, da sie nicht Teil von Spring sind. – Espen

2

der Regel werden Sie diese Fehlermeldung erhalten, wenn zwei Bohnen definiert mit derselben Klasse

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

, wenn Sie die beiden oben genannten Linie haben wir zwei Bohnen mit gleichen Klasse adressieren.

, wenn sie versuchen Sie diese Klasse in jedem anderen autowire eingestuft Sie diese Art von Fehler angezeigt wird

Sie haben zwei Lösungen

Erste Methode

  1. Verwendung Qualifier durch eine bean id definieren init so

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

Zweite Methode

Verwendung JSR250 api (es ist eine JAR-Datei können Sie in Ihren Klassenpfad setzen

Dann wie Sie autowriring unter

@Resource("a") 
MyClass a 

@Resource("b") 
MyClass a 
Verwandte Themen