2012-03-29 44 views
18

我試圖處理@ManagedProperty但沒有成功!CDI中的ManagedProperty @Named bean返回null

我一直在關注this指南,它似乎並不難。 但我的代碼根本行不通!

這裏有一個小片段

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

此代碼給了我一個NullPointerException,說loginBean爲空!

有什麼建議嗎?

+0

不@EJB批註自動注入豆,或者你怎麼注入他們LoginBean @ManagedBeans

javax.enterprise.context.SessionScoped? – 2013-05-06 13:31:04

回答

36

您正在將JSF託管的bean與CDI bean混合在一起。您的LoginBean是JSF管理的bean(它具有@ManagedBean註釋)。您的MessageBean是一個CDI bean(它有@Named註釋)。如果您將Message bean更改爲JSF受管Bean(將@Named替換爲@ManagedBean),那麼應該解決該問題(它也應該與兩個CDI Bean一起使用)。

這裏是注射兩種bean類型之間是如何工作的一個簡短的概述:

CDI @Named - > CDI @Named(作品)

CDI @Named - > JSF @ManagedBean(僅適用如果注入的bean的範圍更廣)

JSF @ManagedBean - > JSF @ManagedBean(僅適用,如果注入的bean的範圍更廣)

JSF @ManagedBean - > CDI @Named(行不通)

但照顧範圍導入類。根據bean的類型,@SessionScoped@RequestScoped有不同的類別。

javax.faces.bean.SessionScoped爲CDI @Named豆

+0

太好了,謝謝! 我已經嘗試用'@ ManagedBean'替換'@ Named',但是我有錯誤的'@ RequestScoped'註解導入,所以它不起作用! – StepTNT 2012-03-29 15:35:55

+0

很高興聽到它的作品。 – 2012-03-29 15:39:38

+0

爲什麼不圍着另一條路走? CDI託管的bean提供更多的靈活性,並且可以完成您的JSF ManagedBeans所能做的一切。請參閱http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-named – JanM 2013-10-30 13:45:24