Ich möchte eine Bean von der Producer-Methode abrufen, um ihre Eigenschaften zu lesen. In einigen Szenarien ist die Bohne eine EJB Singleton
Bohne.injectionPoint.getBean() gibt null zurück, wenn die Bean eine EJB-Bean in Java EE 7 (CDI 1.1) ist.
Ich habe meinen Code vereinfacht, um mich auf das Problem zu konzentrieren.
Meine einfache Qualifier:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface InjectMe {}
Einfach Produzent:
@Dependent
public class SimpleProducer {
@Produces
@InjectMe
public String getInjectMe(InjectionPoint ip) {
// ip.getBean() returns null for some reason
return "ip=" + ip + ", bean=" + ip.getBean();
}
}
EJB (Singleton):
@Singleton
@Startup
public class SimpleSingleton {
@Inject
@InjectMe
private String injectMe;
@PostConstruct
public void init() {
System.out.println(injectMe);
}
}
Console Ausgabe:
Info: ip = [BackedAnnotatedField] @Inject @InjectMe Privat com.test.ejb.SimpleSingleton.injectMe,
bean=null
Wenn ich Singleton
Bohne CDI
Bohne alles in Ordnung zu ändern (ip.getBean()
kehrt nicht null funktioniert). Es arbeitete auch in Java EE 6
sogar mit Singleton
Bean, aber es ist nicht in Java EE 7
. Ich benutze Glassfish 4 Anwendungsserver.
Wird dieses Verhalten irgendwo angegeben?
Klingt wie ein Glassfish Bug. –
@JohnAment: Denke nicht, das gleiche Verhalten für WildFly. Die Frage kann noch nicht beantwortet werden, aber mögliche Gründe können sein: 1) Änderung des Verhaltens des Bean Discovery Moduls (Standard: 'annotiert'); 2) Injizieren einer (nichtkontextuellen) Klasse String; 3) wenn kein anderer Bereich als "Dependent" deklariert wurde –
Wenn Sie 'ip.getMember(). GetDeclaringClass()' aufrufen, erhalten Sie in beiden Fällen den FQCN, der auch als Beispiel im InjectionPoint API doc verwendet wird Ich habe es in einem Deltaspike-Beispiel als Folgeaufruf gesehen, nachdem 'bohnen'' null' ist. –