2012-03-29 58 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