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?
Verwenden Sie [Qualifier] (https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html), wenn Sie mehr als eine Implementierung einer Schnittstelle haben – ares
Siehe [diese Antwort] (http: //stackoverflow.com/questions/22982422/cdi-ambiguous-dependency-with-produces-why). – Casey
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