2017-05-09 4 views
1

konnte nicht injizieren, um die Basisklasse direktUnable Basisklasse mit @Inject Anmerkung

Basis abstrakte Klasse

@Component 
public abstract class A{ 
} 

Here are my derived classes 
@Named("abc") 
public class B extends A{ 
} 

@Named("cde") 
public class C extends A{ 
} 

Ich versuche A zu injizieren in meiner Ressourcenklasse aufzurufen, aber die folgenden Fehler bekommen.

@Inject 
private A a 

@Component 
public class Resource implements ServiceImpl{ 
@Inject 
    public Resource(final Client client, 
      final A a) { 
     Assert.notNull(client); 
     Assert.notNull(a); 

     this.client = client; 
     this.a= a; 

    } 

    @Override 
    public Response method1(final Request request) { 
     Response response = null; 
     try { 
       response = (PaymentResponse) this.a.process(request); 
      } 
      catch (final Exception ex) { 
       ex.printstackTrace(); 
      } 


      return response; 
     } 
    } 

    @Override 
    public Response method2(final Request request) { 
     Response response = null; 
     try { 
      response = this.a.process(request); 
     } 
     catch (final Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return response; 

    } 
} 

Fehler bei der Inbetriebnahme der Anwendung:

org.springframework.beans.factory.UnsatisfiedDependencyException: Fehler Bohne Erstellung mit dem Namen 'Resource' definiert in der Datei Keine Warte Bean vom Typ 'a' ist definiert: erwartete einzelne übereinstimmende Bean aber gefunden 2: b, c

Antwort

0

Um korrekte Bean zu injizieren, müssen Sie @Qualifier Annotation verwenden.

Im Moment weiß Spring nicht, welche Bohne Sie versuchen zu injizieren. 'abc' oder 'cde'.

Da Ihre Basisklasse abstrakt ist, können Sie keine Instanz davon erstellen, daher versucht der Frühling, abgeleitete Klassen zu injizieren. Und deshalb müssen Sie entscheiden, welche Klasse injiziert werden muss, indem Sie sie richtig kommentieren.

+0

Gibt es eine Alternative zu diesem Weg. Weil ich versuche, die gleiche Basisklasse auf 30 verschiedene Klassen zu erweitern. Also um die gleiche Injektion 30 Mal zu vermeiden? . Gibt es auch eine Möglichkeit, den Qualifier auf Methodenebene zu verwenden? – dev21

+0

Wenn es keine Komponenten sein müssen, können Sie eine Fabrikkomponente erstellen und in andere Komponenten injizieren. Die Factory könnte ein erwartetes Objekt erstellen, das von Ihrer Basisklasse stammt. Ich bin mir nicht sicher, was Sie erreichen wollen, aber das Erstellen von 30 Klassen kann ein Zeichen für schlechtes Design sein und Sie möchten vielleicht Ihre Lösung überdenken. Wenn ich geholfen habe, akzeptiere bitte meine Antwort. –