2012-03-29 15 views
18

Próbuję poradzić sobie z @ManagedProperty, ale bez powodzenia!ManagedProperty in CDI @Named bean zwraca wartość null

Podążałem za przewodnikiem this i nie wydaje mi się to trudne. Ale mój kod po prostu nie zadziała!

Oto mały fragment

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

Ten kod daje mi NullPointerException, mówiąc, że loginBean jest zerowy!

Jakieś sugestie?

+0

Does @EJB adnotacji automatycznie wstrzyknąć fasoli, lub w jaki sposób wstrzyknąć im LoginBean? –

Odpowiedz

36

Mieszanie fasoli zarządzanej przez JSF z ziarnami CDI. Twój LoginBean jest komponentem zarządzanym JSF (ma on adnotację @ManagedBean). Twój MessageBean jest ziarnem CDI (ma adnotację @Named). Jeśli zmieniono komponent bean komunikatu na zarządzany komponent bean JSF (zastępując @Named przez @ManagedBean), problem powinien zostać rozwiązany (powinien również działać z dwoma ziarnami CDI).

Oto krótki przegląd jak zastrzyk działa między obu rodzajami fasoli:

CDI @Named -> CDI @Named (prace)

CDI @Named -> JSF @ManagedBean (działa tylko jeśli zakres jest szerszy wtryskiwanego fasoli)

JSF @ManagedBean -> JSF @ManagedBean (działa tylko wtedy, gdy zakres jest szerszy wtryskiwanego fasoli)

JSF @ManagedBean -> CDI @Named (nie będzie działać)

Ale zajmij się klasami importu zakresu. Istnieją różne klasy dla @SessionScoped i @RequestScoped w zależności od typu fasoli.

javax.faces.bean.SessionScoped dla @ManagedBeans

javax.enterprise.context.SessionScoped dla CDI @Named fasoli

+0

Świetne, dzięki! Próbowałem już zastąpić '@Named' przez' @ ManagedBean', ale miałem nieprawidłowy import adnotacji '@ RequestScoped', więc nie działało! – StepTNT

+0

Dobrze słyszeć, że to działa. –

+0

Dlaczego nie przejść w inny sposób? Ziarna zarządzane przez komponent CDI zapewniają większą elastyczność i mogą wykonywać wszystkie operacje zarządzane przez JSF ManagedBeans. Zobacz http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-name – JanM

Powiązane problemy