Keine eindeutige Bean vom Typ definiert: erwartete einzelne übereinstimmende Bean, aber gefunden 2 [Duplikat]

7

Ich erhalte die folgende Ausnahme, wenn ich den Code bereitstelle

%Vor%

Ich habe 3 verschiedene Projekte, eines ist Common, das zweite ist Adapter und das dritte ist Service. Der Adapter ist abhängig von Common und Service ist abhängig von Adapter. Alle drei sind Maven-Projekte. Jetzt in meinem gemeinsamen Projekt habe ich eine Schnittstelle namens CommonAdapter.java

%Vor%

Ich habe eine Klasse namens AdapterFactory.java im selben Projekt (ich, Common)

%Vor%

Jetzt habe ich in meinem Adapter-Projekt die Implementierungsklassen für CommonAdapter.java Einer ist EndecaAdapetr.java und der andere ist SolarAdapter.java

%Vor%

Nun möchte ich in meinem Dienstprojekt die Dienstmethode der obigen zwei Klassen basierend auf der Eingabe aufrufen.

%Vor%     
user2334926 10.03.2014, 12:26
quelle

4 Antworten

11

@Autowired funktioniert nur, wenn keine Zweifel besteht, welche containerverwaltete Instanz injiziert werden soll. Grundsätzlich kann dies auf (mindestens) 3 Arten erreicht werden:

  1. Es gibt nur eine vom Container verwaltete Bean, die als IS-A-Typ des autowired-Feldes deklariert ist;
  2. Es gibt mehr containergesteuerte Beans, die die obige IS-A-Bedingung validieren, aber das Feld mit dem Autowired ist auch qualifiziert (im Frühjahr, indem eine @Qualifier Annotation verwendet wird)
  3. Sie verwenden nicht @Autowired , sondern injizieren die Beans nach Namen.

In Ihrem Fall haben Sie zwei Beans, die die IS-A-Bedingung validieren:

endeca IS-A Adapter

und

solar IS-A Adapter .

Der Container hat also keinen eindeutigen Autowire-Kandidaten, daher stürzt er beim Einrichten ab.

    
Andrei Nicusan 10.03.2014 13:17
quelle
7

Verwenden Sie @Primary und @Resource , wenn Sie mehrere Implementierungsklassen haben.

%Vor%

und injizieren wie:

%Vor%     
Rembo 10.03.2014 13:28
quelle
1

Es gibt eine andere JPA-Standardlösung: Sie können @named und @inject verwenden, das Beispiel wird also so aussehen:

%Vor%

und Inject wird so sein:

%Vor%

Sie brauchen nicht, Name, Spring tun es selbst:)

    
Seba Echarte 04.12.2014 19:40
quelle
-1

Bereits aufgelöst hier .

Sie müssen die Komponente mit @javax.annotation.Resource(name="componentName") einfügen.

    
user2065095 04.12.2015 09:00
quelle

Tags und Links