Ich habe Klassenhierarchie wo ich Feld mit CDI basierend auf Art der Unterklasse injizieren möchte. Diese Situation ist in der folgenden Java-Code beschrieben:CDI: Injection basierend auf Objektklasse
@Stateless
public class A {
@Inject
@MyInjection
D d;
...
public void templateMethod(){...};
protected void step1(){...};
protected void step2(){...};
}
@Stateless
public class B extends A {
...
protected void step1(){...};
protected void step2(){...};
}
@Stateless
public class C extends A {
...
protected void step1(){...};
protected void step2(){...};
}
public class F {
@Produces
@MyInjection
D myProducer(InjectionPoint ip){
Class<?> clazz = ip.getMember().getDeclaringClass();
//if clazz is B then inject one type
//if clazz is C then inject other type
//default inject default type
}
}
Diese Bohnen entsprechendes ejb.jar Archiv als Teil der EAR verpackt sind und es gibt beans.xml Datei in der richtigen Stelle. Der Code wird unter Verwendung von Java EE 7 auf Wildfly 10 Server ausgeführt.
Mit diesem Code bekomme ich Klasse der Hierarchie Basisklasse (in diesem speziellen Fall Klasse A), die ist, wenn ich darüber logisch denke, weil InjectionPoint Feld ist in der Tat in Klasse A. Der Punkt ist, dass ich eine Unterscheidung basierend auf Unterklassen machen möchte, obwohl ich in der Oberklasse injizieren.
Kann ich dies mit der InjectionPoint-Klasse erreichen? Gibt es einen möglichen Weg dies zu erreichen?
Mehr dazu, was ich mit diesem Stück Code erreichen möchte. Diese Hierarchie implementiert die Template-Methode Design Pattern und alle Klassen sind konkret. Sie können die Klasse A verwenden, die den allgemeinen Algorithmus und bestimmte Schritte implementiert. Sie können jedoch die Schritte in einigen Unterklassen neu definieren. Außerdem muss ein spezifischer Typ D injiziert werden, der sich je nach Unterklasse unterscheiden kann.
Leider gibt es einen starken Wunsch, Bassklasse A nicht neu zu gestalten. Also versuche ich, etwas in der Basisklasse mit CDI zu injizieren und verwende keinen Deployment Deskriptor.
Bitte erwähnen Sie in Ihrer Frage alles, was Sie versuchten –