CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null

Posted

技术标签:

【中文标题】CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null【英文标题】:@javax.faces.bean.ManagedProperty in CDI @Named bean returns 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? 【参考方案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 可以做的所有事情。见***.com/questions/4347374/… @JanM 我正在​​从 managedbean 切换到命名。您是否知道我是否必须将 EJB 更改为 Inject 并将 ManagedProperty 更改为 Inject ?提前致谢。 @Ced 您不必将@EJB 切换为@Inject,但@ManagedProperty 只能在JSF 托管bean 中使用,因此不能在纯CDI 上下文中使用,因此请将它们替换为@ 987654346@.

以上是关于CDI @Named bean 中的 @javax.faces.bean.ManagedProperty 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

在glassfish 5 build 25中,CDI bean导致javax.el.PropertyNotFoundException

将 JSF 托管 bean 迁移到 CDI 托管 bean

如何以编程方式将 Java CDI 托管 bean 注入(静态)方法中的局部变量

javax.el.PropertyNotFoundException:类“xxx”没有可读属性“yyy”

@ApplicationScoped CDI bean 和 @PersistenceContext - 这安全吗?

您如何在当前视图(范围)中找到 CDI bean?