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
如何以编程方式将 Java CDI 托管 bean 注入(静态)方法中的局部变量
javax.el.PropertyNotFoundException:类“xxx”没有可读属性“yyy”