ManagedProperty en CDI @Named bean devuelve null

¡Estoy tratando de lidiar con @ManagedProperty pero sin éxito!

He estado siguiendo esta guía, y no parece tan difícil. ¡Pero mi código simplemente no funciona!

Aquí hay un pequeño fragmento

@ManagedBean @SessionScoped public class LoginBean { @EJB private LoginUserLocal loginUser; private boolean loggedIn = false; private User user; private StreamedContent image; . . . //-- @Named(value = "messagesBean") @RequestScoped public class MessagesBean { @ManagedProperty(value = "#{loginBean}") private LoginBean loginBean; public LoginBean getLoginBean() { return loginBean; } public void setLoginBean(LoginBean loginBean) { this.loginBean = loginBean; } public String getUser() { System.err.println(loginBean == null); return loginBean.getUser().getUsername(); } 

Este código me da una NullPointerException, diciendo que loginBean es nulo!

¿Cualquier sugerencia?

Está mezclando beans administrados JSF con beans CDI. Su LoginBean es un bean gestionado JSF (tiene la anotación @ManagedBean ). Su MessageBean es un bean CDI (tiene la anotación @Named ). Si cambió el bean Message a un bean gestionado JSF (reemplazando @Named con @ManagedBean ), entonces el problema debería resolverse (también debería funcionar con dos beans CDI).

Aquí hay una breve descripción de cómo funciona la inyección entre ambos tipos de frijoles:

CDI @Named -> CDI @Named (funciona)

CDI @Named -> JSF @ManagedBean (funciona solo si el scope del bean inyectado es más amplio)

JSF @ManagedBean -> JSF @ManagedBean (funciona solo si el scope del bean inyectado es más amplio)

JSF @ManagedBean -> CDI @Named (no funcionará)

Pero cuida las clases de importación de scope. Hay diferentes clases para @SessionScoped y @RequestScoped dependiendo del tipo de bean.

javax.faces.bean.SessionScoped para javax.faces.bean.SessionScoped

javax.enterprise.context.SessionScoped para CDI @Named beans

Además, para @Named (CDI), use @Inject y para @Inject use @Inject . Hay una cosa que no funciona en CDI. Su @ManagedProperty(value = "#{loginBean}") obtiene un bean completo, pero @ManagedProperty(value = "#{loginBean.user}") para obtener una ‘propiedad’ de un bean. Esto no es directamente posible en CDI con @Inject . Ver Reemplazo de CDI para @ManagedProperty para una ‘solución’