NullPointerException al intentar acceder a @Inject bean en el constructor

Tengo una sesión de Bean con ámbito:

@Named @SessionScoped public class SessionBean implements Serializable { private String someProperty; public String getSomeProperty() { return someProperty; } } 

Me gustaría insertar esto en un bean con ámbito de solicitud e inicializar con él:

 @Named @RequestScoped public class RequestBean { @Inject private SessionBean sessionBean; public RequestBean() { System.out.println(sessionBean.getProperty()); } } 

Sin embargo, arroja la siguiente excepción:

 java.lang.NullPointerException at com.example.RequestBean.(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) ... 

¿Cómo es esto causado y cómo puedo resolverlo?

Está esperando que la dependencia inyectada esté disponible antes de que se construya el bean. Esperas que funcione así:

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

Sin embargo, esto no es cierto y técnicamente imposible. Las dependencias se inyectan después de la construcción.

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

Debería utilizar un método @PostConstruct en su lugar si tiene la intención de realizar una lógica comercial basada en las dependencias inyectadas directamente después de la construcción de bean.

Elimine el constructor y agregue este método:

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

La respuesta de BalusC es correcta, pero refleja la fase de asignación de una creación de objeto que no se ejecutó en este momento. Pero, de todos modos, el frijol CDI debería estar accesible si lo grep progtwigticamente a través de:

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