2012-03-29 4 views
18

Sto cercando di gestire @ManagedProperty ma senza successo!ManagedProperty in CDI @Named bean restituisce null

Ho seguito la guida this, e non sembra così difficile. Ma il mio codice semplicemente non funzionerà!

Ecco un piccolo frammento

@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(); 
} 

Questo codice mi dà un NullPointerException, dicendo che loginBean è nullo!

Qualche suggerimento?

+0

fa @EJB annotazione iniettare automaticamente il fagiolo, o come si fa di iniezione loro di LoginBean? –

risposta

36

Si stanno mescolando fagioli gestiti JSF con fagioli CDI. Il tuo LoginBea è un bean gestito JSF (ha l'annotazione @ManagedBean). Il tuo MessageBean è un bean CDI (ha l'annotazione @Named). Se hai modificato il bean Message in un bean gestito JSF (sostituendo @Named con @ManagedBean), il problema dovrebbe essere risolto (dovrebbe funzionare anche con due bean CDI).

Ecco una breve panoramica di come funziona l'iniezione tra i due tipi di fagioli:

CDI @Named -> CDI @Named (opere)

CDI @Named -> JSF @ManagedBean (funziona solo se portata del fagiolo iniettata è più ampio)

JSF @ManagedBean -> JSF @ManagedBean (funziona solo se portata del fagiolo iniettata è più ampio)

JSF @ManagedBean -> CDI @Named (non funzionerà)

Ma prenditi cura delle classi di importazione dell'ambito. Esistono diverse classi per @SessionScoped e @RequestScoped a seconda del tipo di bean.

javax.faces.bean.SessionScoped per @ManagedBeans

javax.enterprise.context.SessionScoped per i fagioli CDI @Named

+0

Grande, grazie! Ho già provato a sostituire '@ Named' con' @ ManagedBean', ma ho sbagliato l'importazione delle annotazioni '@ RequestScoped', quindi non ha funzionato! – StepTNT

+0

Buono a sapersi che funziona. –

+0

Perché non andare dall'altra parte? I bean gestiti da CDI offrono maggiore flessibilità e possono fare tutto ciò che possono fare i bean gestiti da JSF. Vedi http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-named – JanM