NullPointerException lors de la tentative d'accès au bean @Inject dans le constructeur
J'ai une session d'étendue de haricot:
@Named
@SessionScoped
public class SessionBean implements Serializable {
private String someProperty;
public String getSomeProperty() {
return someProperty;
}
}
Je voudrais injecter ce dans la portée de la requête de haricot et de l'initialiser avec elle:
@Named
@RequestScoped
public class RequestBean {
@Inject
private SessionBean sessionBean;
public RequestBean() {
System.out.println(sessionBean.getProperty());
}
}
Cependant, il lève l'exception suivante:
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)
...
Comment est-il la cause et comment puis-je le résoudre?
source d'informationauteur eric.itzhak | 2013-05-06
Vous devez vous connecter pour publier un commentaire.
Vous attendons à ce que l'injection de dépendance est disponible avant le haricot est construit. Vous attendez qu'il fonctionne comme ceci:
Ce n'est cependant pas vrai et techniquement impossible. Les dépendances sont injectés après construction.
Vous devriez être en utilisant un
@PostConstruct
méthode au lieu de cela, si vous avez l'intention d'effectuer une logique d'entreprise basée sur l'injection de dépendances directement après l'haricot de construction.Supprimer le constructeur et ajouter cette méthode:
BalusC la réponse est correcte, mais ne reflète la mission de la phase de création de l'objet, qui n'avait pas cours à ce moment. Mais de toute façon le
CDI
bean devrait être accessible si vousgrep
lui en programmant par l'intermédiaire de: