2013-05-06 10 views
11

ho una sessione bean con scope:NullPointerException durante il tentativo di accedere a fagiolo @Inject nel costruttore

@Named 
@SessionScoped 
public class SessionBean implements Serializable { 

    private String someProperty; 

    public String getSomeProperty() { 
     return someProperty; 
    } 

} 

mi piacerebbe per iniettare questo in una richiesta ambito di fagioli e inizializzare con esso:

@Named 
@RequestScoped 
public class RequestBean { 

    @Inject 
    private SessionBean sessionBean; 

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

} 

Tuttavia, viene generata la seguente eccezione:

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

Come è causato e come posso risolverlo?

+0

La dipendenza può essere iniettato solo una volta l'istanza è fatto, ma lo si utilizza all'interno del costruttore. Prova a eseguire il codice in fase di post-costruzione. –

+0

L'ho fatto. stesso risultato. –

+0

Credo che tu non abbia capito la parte "post-costruzione". Dovresti usare un metodo '@ PostConstruct' e assolutamente non invocarlo dall'interno del costruttore. – BalusC

risposta

22

Si aspetta che la dipendenza iniettata sia disponibile prima che il bean sia costruito. Ti aspetti che funzioni in questo modo:

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

Questo non è tuttavia vero e tecnicamente impossibile. Le dipendenze sono iniettate dopo la costruzione di.

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

Si deve usare un metodo @PostConstruct, invece, se si intende eseguire la logica di business basato sulle dipendenze iniettati direttamente dopo la costruzione del bean.

Rimuovere il costruttore e aggiungere questo metodo: risposta

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

Ho modificato la domanda, ho provato a utilizzare PostConstruct e lo stesso risultato. –

+1

Stai ancora utilizzando il costruttore. Rimuoverla. Rileggere la prima parte della risposta Vorrei anche suggerire di prendere una pausa JSF e [imparare alcune basi Java] (http://docs.oracle.com/javase/tutorial/) prima di continuare con JSF. – BalusC

1

di BalusC è corretto, ma è non riflette la fase di assegnazione di una creazione di oggetti, che non ha eseguito in questo momento. Ma comunque il fagiolo CDI deve essere accessibile se si grep programatically tramite:

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