我正在尝试处理 @ManagedProperty ,但没有成功!
我一直关注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为null!
有什么建议吗?
答案 0 :(得分:38)
您正在将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(无效)
但要注意范围导入类。 @SessionScoped
和@RequestScoped
有不同的类,具体取决于bean类型。
CDI @Named beans
javax.faces.bean.SessionScoped
代表@ManagedBeans
javax.enterprise.context.SessionScoped
此外,对于@Named
(CDI),使用@Inject
和@ManagedBean
使用@ManagedProperty
。有一件事在CDI中不起作用。你的@ManagedProperty(value = "#{loginBean}")
得到一个完整的bean,但@ManagedProperty(value = "#{loginBean.user}")
得到一个bean的'属性'。使用@Inject
的CDI无法直接实现这一点。有关“解决方案”的信息,请参阅CDI Replacement for @ManagedProperty