CDI @Named bean中的ManagedProperty返回null

Ste*_*TNT 20 jsf ejb cdi managed-bean jboss-weld

我正在尝试处理@ManagedProperty但没有成功!

我一直在关注这个指南,看起来并不难.但我的代码根本行不通!

这是一个小片段

@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();
}
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个NullPointerException,说loginBean为null!

有什么建议吗?

Mat*_*ndy 40

您正在将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

javax.enterprise.context.SessionScoped 对于CDI @Named bean

此外,用于@Named(CDI)使用@Inject@ManagedBean使用@ManagedProperty.有一件事在CDI中不起作用.你@ManagedProperty(value = "#{loginBean}")得到一个完整的bean,但@ManagedProperty(value = "#{loginBean.user}")要得到一个bean 的"属性".这在CDI中是不可能直接实现的@Inject.请参阅@ManagedProperty的CDI替换以获得"解决方案"

  • @Ced你不必为`@Inject`切换`@EJB`,但`@ManagedProperty`只能在JSF托管bean中使用,因此不能在纯CDI上下文中使用,所以用`@Inject`替换它们. (2认同)