2017-07-08 4 views
0

Ich habe eine Frage zu Erbe und CDI. Gegeben zwei Schnittstellen:Injection mit Erbe und CDI

  • Auto Schnittstelle
  • Sportcar, die mit Auto

    interface Car { 
    } 
    
    interface SportCar extends Car{ 
    
    } 
    
    
    class DefaultCar implements Car { 
    
    } 
    
    
    @FerrariQualifier 
    class DefaultSportCar implements SportCar { 
    
    } 
    

Was ich möchte injizieren erstreckt: kann

@Inject 
    private Car car; //inject DefaultCar 

    @Inject 
    @FerrariQualifier 
    private Car ferrari; //inject DefaultSportCar 


    @Inject 
    private SportCar sportCar;//inject DefaultSportCar 

Wie Ich mach das?

+0

Es wäre hilfreich, die mehrdeutige Auflösungsausnahme zu zeigen, die Sie mit dem aktuellen Code erhalten, vorausgesetzt, das ist Ihr Problem. – covener

Antwort

2

Ohne weitere Beispiele oder Erklärungen, müssen Sie die erste mit Qualifier @Default injizieren.

Dies erfordert natürlich, dass jedes weitere 'Auto' ein Nicht-Standard-Qualifikationsmerkmal hat, ansonsten haben Sie eine mehrdeutige Auflösung und Sie versuchen, etwas in CDI zu schuhen, das nicht passt.

1

Ich denke, Sie haben die CDI-Injektion ein wenig missverstanden. Vor allem, dass Sie dies tun wollen:

@Inject 
private Car car; //inject DefaultCar 

Da jede Auto-Implementierung (Sportwagen oder gewöhnliche) passt hier und Sie werden mit mehrdeutigen Auflösung enden.

Als temporäre Lösung, können Sie die Verwendung des @Default Qualifier machen als vom User covener bemerkt aber dies ist verpflichtet, so schnell zu brechen, wie Sie ohne Qualifier andere Auto Implementierung einzuführen.

Die sauberste Lösung ist vielleicht neu denken das Design und die Änderung der Hierarchie wie folgt aus:

interface Car { 
    // all cars, place common methods here 
} 

interface SportCar extends Car{ 
    // interface for all sport cars 
} 

interface ClassicCar extends Car{ 
    // interface for all non-sport cars 
    // this is what you will inject 
} 

class DefaultCar implements ClassicCar { 

} 

@FerrariQualifier 
class DefaultSportCar implements SportCar { 

} 

Mit diesem können Sie dann:

@Inject 
private ClassicCar car; 

Und eine Instanz von DefaultCar bekommen. Der Rest Ihrer Injektionen funktioniert genauso.

Die andere Lösung besteht darin, Qualifier zu verwenden.

Im Allgemeinen - wann immer Sie auf mehrdeutige Auflösung stoßen, haben Sie mehr als eine Bean für die Injektion und Sie müssen die Auswahl einschränken, indem Sie entweder Qualifier verwenden oder eine spezifischere Schnittstelle/Klasse einfügen.