2016-05-15 5 views
1

Gibt es eine Möglichkeit, eine konkrete Implementierung von @Produces zurückgegebene Schnittstelle zu injizieren?Declare @Inject als konkrete Implementierung von @Produces zurückgegebene Schnittstelle

SomeClassImpl implements SomeClass { 
    public Integer iField; 
} 

Producer Klasse:

@Produces 
public SomeClass produceChild(){ 
    SomeClassImpl impl = new SomeClassImpl(); 
    impl.iField = 17; 
    return impl; 
} 

Verbraucherklasse:

@Inject SomeClassImpl classImpl; 

EDIT

Der Versuch, @Inject SomeClassImpl nicht Behälter zwingen, die @Produces Methode zu verwenden, die zurückgibt Super-Typ SomeClass.

Warum ist es möglich, Kind-Typ über @Inject Eltern-Typ (ohne Hersteller) zu injizieren, aber keine Varianten injizieren Kind-Typ über @Produces Eltern-Typ?

+0

Verwenden Sie [Qualifier] (https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html), wenn Sie mehr als eine Implementierung einer Schnittstelle haben – ares

+0

Siehe [diese Antwort] (http: //stackoverflow.com/questions/22982422/cdi-ambiguous-dependency-with-produces-why). – Casey

+0

In Bezug auf Ihre Bearbeitung, weil Ihre '@ Produces' Methode eine' SomeClass' Instanz erzeugt, nicht eine 'SomeClassImpl' Instanz, die irgendeine Implementierung von' SomeClass', nicht nur 'SomeClassImpl' Instanzen zurückgeben könnte. Sie können es reparieren, indem Sie 'SomeClass' (nicht die Implementierung) einfügen und ein Qualifikationsmerkmal verwenden, oder indem Sie Ihre' @ Produces' Methode ändern, um 'SomeClassImpl' zurückzugeben. – Casey

Antwort

Verwandte Themen