2012-03-29 15 views
18

Estoy tratando de tratar con @ManagedProperty pero sin éxito!ManagedProperty en CDI @Named bean devuelve nulo

He estado siguiendo this 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!

¿Alguna sugerencia?

+0

¿El @EJB anotación inyectar automáticamente el frijol, o ¿cómo se las inyectan a LoginBean? –

Respuesta

36

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

He aquí una breve descripción general de cómo funciona la inyección entre los dos tipos de frijol:

CDI @Named -> CDI @Named (obras)

CDI @Named -> JSF @ManagedBean (sólo funciona Si alcance de frijol inyectado es más amplio)

JSF @ManagedBean -> JSF @ManagedBean (sólo funciona si el alcance de frijol inyectado es más amplio)

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

Pero tenga en cuenta las clases de importación del osciloscopio. Existen diferentes clases para @SessionScoped y @RequestScoped dependiendo del tipo de bean.

javax.faces.bean.SessionScoped para @ManagedBeans

javax.enterprise.context.SessionScoped para los granos de CDI @Named

+0

Genial, gracias! Ya intenté reemplazar '@ Named' con' @ ManagedBean', pero tuve la importación incorrecta de la anotación '@ RequestScoped', ¡así que no funcionó! – StepTNT

+0

Me alegra saber que funciona. –

+0

¿Por qué no ir por el otro lado? Los beans administrados CDI proporcionan más flexibilidad y pueden hacer todo lo que pueda con sus ManagedBeans de JSF. Ver http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-named – JanM

Cuestiones relacionadas