Ste*_*TNT 20 jsf ejb cdi managed-bean jboss-weld
我正在尝试处理@ManagedProperty但没有成功!
我一直在关注这个指南,看起来并不难.但我的代码根本行不通!
这是一个小片段
@ManagedBean
@SessionScoped
public class LoginBean {
@EJB
private LoginUserLocal loginUser;
private boolean loggedIn = false;
private User user;
private StreamedContent image;
.
.
.
//--
@Named(value = "messagesBean")
@RequestScoped
public class MessagesBean {
@ManagedProperty(value = "#{loginBean}")
private LoginBean loginBean;
public LoginBean getLoginBean() {
return loginBean;
}
public void setLoginBean(LoginBean loginBean) {
this.loginBean = loginBean;
}
public String getUser() {
System.err.println(loginBean == null);
return loginBean.getUser().getUsername();
}
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个NullPointerException,说loginBean为null!
有什么建议吗?
Mat*_*ndy 40
您正在将JSF托管bean与CDI bean混合使用.您的LoginBean是一个JSF托管bean(它有@ManagedBean
注释).您的MessageBean是一个CDI bean(它有@Named
注释).如果您将Message bean更改为JSF托管bean(替换@Named
为@ManagedBean
),那么问题应该解决(它也应该与两个CDI bean一起使用).
以下是两种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 bean
此外,用于@Named
(CDI)使用@Inject
和@ManagedBean
使用@ManagedProperty
.有一件事在CDI中不起作用.你@ManagedProperty(value = "#{loginBean}")
得到一个完整的bean,但@ManagedProperty(value = "#{loginBean.user}")
要得到一个bean 的"属性".这在CDI中是不可能直接实现的@Inject
.请参阅@ManagedProperty的CDI替换以获得"解决方案"
归档时间: |
|
查看次数: |
13156 次 |
最近记录: |