![](/img/trans.png)
[英]use javax.faces.view.ViewScoped with CDI Spring bean and JSF
[英]@javax.faces.bean.ManagedProperty in CDI @Named bean returns null
我正在尝试处理@javax.faces.bean.ManagedProperty
但没有成功!
我一直在遵循本指南,这似乎并不难。 但我的代码根本行不通!
这是一个小片段
@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
是空的!
有什么建议吗?
您将 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(不起作用)
但要注意范围导入类。 根据 bean 类型, @SessionScoped
和@RequestScoped
有不同的类。
@ManagedBeans 的
javax.faces.bean.SessionScoped
用于 CDI @Named bean 的
javax.enterprise.context.SessionScoped
此外,对于@Named
(CDI) 使用@Inject
,对于@ManagedBean
使用@ManagedProperty
。 有一件事在 CDI 中不起作用。 您的@ManagedProperty(value = "#{loginBean}")
获得了一个完整的 bean,但是@ManagedProperty(value = "#{loginBean.user}")
获得了一个 bean 的“属性”。 这在带有@Inject
CDI 中是不可能直接实现的。 有关“解决方案”,请参阅@ManagedProperty 的 CDI 替换
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.