CDI @Named bean中的ManagedProperty返回null

时间:2012-03-29 08:00:41

标签: jsf ejb cdi jboss-weld managed-bean

我正在尝试处理 @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!

有什么建议吗?

1 个答案:

答案 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类型。

  

javax.faces.bean.SessionScoped代表@ManagedBeans

     CDI @Named beans

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