【问题标题】:@javax.faces.bean.ManagedProperty in CDI @Named bean returns nullCDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null
【发布时间】:2012-04-12 20:39:20
【问题描述】:

我正在尝试处理@javax.faces.bean.ManagedProperty,但没有成功!

我一直在关注this 指南,似乎并不难。 但是我的代码根本行不通!

这里有一个小sn-p

@ManagedBean
@SessionScoped
public class LoginBean {

    private User user;

    // ...
}
@Named
@RequestScoped
public class MessagesBean {

    @ManagedProperty(value = "#{loginBean}")
    private LoginBean loginBean;

    public String getUser() {
        System.err.println(loginBean == null);
        return loginBean.getUser().getUsername();
    }

    // ...
}

这段代码给了我一个NullPointerException,说loginBean是空的!

有什么建议吗?

【问题讨论】:

  • @EJB 注解是否会自动注入 bean,或者如何将它们注入到 LoginBean?

标签: jsf cdi managed-bean managed-property


【解决方案1】:

您正在将 JSF 托管 bean 与 CDI bean 混合使用。您的 LoginBean 是 JSF 托管 bean(它具有 @ManagedBean 注释)。您的 MessageBean 是一个 CDI bean(它具有 @Named 注释)。如果您将 Message bean 更改为 JSF 托管 bean(将 @Named 替换为 @ManagedBean),那么问题应该得到解决(它也应该与两个 CDI bean 一起使用)。或者,如果您使用的是 JSF 2.3 或更新版本,则在 CDI bean 中使用 javax.faces.annotation.ManagedProperty

以下是两种 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 beans

此外,@Named (CDI) 使用 @Inject@ManagedBean 使用 @ManagedProperty。有一件事在 CDI 中不起作用。您的 @ManagedProperty(value = "#{loginBean}") 获得了一个完整的 bean,但 @ManagedProperty(value = "#{loginBean.user}") 获得了一个 bean 的“属性”。这在使用@Inject 的 CDI 中是无法直接实现的。有关“解决方案”,请参阅 CDI Replacement for @ManagedProperty

【讨论】:

  • 太好了,谢谢!我已经尝试用@ManagedBean 替换@Named,但是我有错误的@RequestScoped 注释导入,所以它不起作用!
  • 为什么不反过来呢? CDI 托管 bean 提供了更大的灵活性,并且可以完成您的 JSF ManagedBeans 可以做的所有事情。见stackoverflow.com/questions/4347374/…
  • @JanM 我正在​​从 managedbean 切换到命名。您是否知道我是否必须将 EJB 更改为 Inject 并将 ManagedProperty 更改为 Inject ?提前致谢。
  • @Ced 您不必将@EJB 切换为@Inject,但@ManagedProperty 只能在JSF 托管bean 中使用,因此不能在纯CDI 上下文中使用,因此请将它们替换为@ 987654346@.
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 2016-04-11
  • 2015-01-04
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多