我试图处理@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
注释(。如果将消息 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
有不同的类。
javax.faces.bean.SessionScoped
@ManagedBeans
CDI @Named豆
javax.enterprise.context.SessionScoped
此外,对于@Named
(CDI(使用@Inject
,对于@ManagedBean
使用@ManagedProperty
。有一件事在 CDI 中不起作用。你的@ManagedProperty(value = "#{loginBean}")
得到了一个完整的豆子,但@ManagedProperty(value = "#{loginBean.user}")
得到一个豆子的"属性"。这在带有 @Inject
的 CDI 中是无法直接实现的。有关"解决方案"的@ManagedProperty,请参阅 CDI 替换