2016-01-06 14 views
5

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?

+0

Klingt wie ein Glassfish Bug. –

+0

@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 –

+0

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. –

Antwort

1

Mit

injectionPoint.getMember().getDeclaringClass() 

Werke für mich in Wildfly 10.1.0 und ich auch getestet es schnell in Payara Server 4.1.1.162 #badassfish (Build 116). Ich habe auch einen Test auf brandneuen Payara Server 4.1.1.164 # Badassfish (Build 28) gemacht. Allerdings musste ich den Bereich der Producer-Bean auf @ApplicationScoped ändern. Der Standardbereich hat nicht funktioniert. In meinem Fall ist es sogar sinnvoll :)

Die

injectionPoint.getBean().getBeanClass() 

Methode für mich in der alten Payara gearbeitet, aber nicht in dem neuen Wildfly 10.1.0.Final und neuer Payara Server 4.1.1.164 # Badassfish (Build 28).

Wenn Sie sich Payara ansehen, enthält die aktuelle neue Version 164 Weld 2.4.0.Final und WildFly 10.1.0Final verwendet Version 2.3.5.Final. In beiden Versionen funktioniert der klassische Code nicht!

Die Schlussfolgerung ist, auf älteren CDI-Implementierungen (Weld) funktioniert es. In einigen neueren Weld (eingeführt in Payara 161) änderte sich das Verhalten. Ich weiß nicht, ob das beabsichtigt ist oder nicht.

jedoch die Lösung ist

injectionPoint.getMember().getDeclaringClass() 

zu verwenden und die Produzenten Bohne mit

@javax.enterprise.context.ApplicationScoped 

Anmerkung Anmerkungen versehen.

+1

Getestet auf Weblogic 12.2.1 (CDI 1.1) und ich habe auch das gleiche Problem. Während es funktionierte auf Weblogic 12.1.3 (CDI 1.0). Wie Sie sagten, löste ich das Problem mit 'injectionPoint.getMember(). GetDeclargingClass()' – Rouliboy

+0

Sieht aus wie dies bereits erkannt wird: https://issues.jboss.org/browse/WELD-2339 –