2013-05-06 15 views
11

Ich habe eine Sitzung scoped Bohne:Nullpointer beim Versuch @Inject Bean zuzugreifen in Konstruktor

@Named 
@SessionScoped 
public class SessionBean implements Serializable { 

    private String someProperty; 

    public String getSomeProperty() { 
     return someProperty; 
    } 

} 

Ich möchte diese scoped in einer Anfrage-Bean injizieren und initialisieren damit:

@Named 
@RequestScoped 
public class RequestBean { 

    @Inject 
    private SessionBean sessionBean; 

    public RequestBean() { 
     System.out.println(sessionBean.getProperty()); 
    } 

} 

Allerdings wirft es die folgende Ausnahme:

java.lang.NullPointerException 
    at com.example.RequestBean.<init>(RequestBean.java:42) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at org.jboss.weld.introspector.jlr.WeldConstructorImpl.newInstance(WeldConstructorImpl.java:206) 
    at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:117) 
    at org.jboss.weld.bean.ManagedBean.createInstance(ManagedBean.java:336) 
    at org.jboss.weld.bean.ManagedBean$ManagedBeanInjectionTarget.produce(ManagedBean.java:200) 
    at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:292) 
    ... 

Wie wird diese verursacht und wie kann ich sie lösen?

+0

Die Abhängigkeit kann nur injiziert werden, sobald die Instanziierung erfolgt ist, aber Sie verwenden sie im Konstruktor. Versuchen Sie, den Code beim Post-Construction auszuführen. –

+0

tat ich. gleiches Ergebnis. –

+0

Ich glaube, Sie haben den "Post-Construction" -Teil nicht verstanden. Sie sollten eine @ PostConstruct-Methode verwenden und sie absolut nicht innerhalb des Konstruktors aufrufen. – BalusC

Antwort

22

Sie erwarten, dass die injizierte Abhängigkeit verfügbar ist, bevor die Bean erstellt wird. Sie erwarten, dass es so funktioniert:

Dies ist jedoch nicht wahr und technisch unmöglich. Die Abhängigkeiten werden nach Konstruktion injiziert.

RequestBean requestBean; 
requestBean = new RequestBean(); // Constructor invoked. 
requestBean.sessionBean = sessionBean; // Injection. 

Sie sollten eine @PostConstruct Methode stattdessen verwenden, wenn Sie beabsichtigen, auf injiziert Abhängigkeiten Geschäftslogik auszuführen basierend direkt nach dem Bau der Bohne.

Entfernen der Konstruktor und fügen Sie diese Methode:

@PostConstruct 
public void init() { 
    System.out.println(sessionBean.getSomeProperty()); 
} 
+0

Ich habe die Frage bearbeitet, mit PostConstruct versucht und immer noch das gleiche Ergebnis. –

+1

Sie verwenden immer noch den Konstruktor. Entfernen Sie es. Lies den ersten Teil der Antwort noch einmal durch. Ich würde auch vorschlagen, eine JSF-Pause einzulegen und [etwas grundlegendes Java zu lernen] (http://docs.oracle.com/javase/tutorial/), bevor ich mit JSF fortfahre. – BalusC

1

BalusC Antwort ist richtig, aber ist funktioniert die Zuweisungsphase einer Objekterstellung reflektieren, die zu diesem Zeitpunkt nicht ausgeführt werden. Aber wie auch immer die CDI Bohne sollte zugänglich sein, wenn Sie es grep programmatisch über:

javax.enterprise.inject.spi.CDI.current().select(SessionBean.class).get()