我试图从ManagedBeanUtil类获取我的SessionScoped managedBean的对象,但所有iam获取都是null。
这是我的代码: -
package com.beas.ui.manager;
@ManagedBean(name = "sessionManager")
@SessionScoped
public class SessionManager implements Serializable {
private static final long serialVersionUID = -3064514740080155761L;
//..
}
public class ManagedBeanUtil {
public static SessionManager getSessionManager() {
return (SessionManager) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("sessionManager"); // returns null
}
}
我不知道我做错了什么。任何人都可以为此提供合适的解决方案吗?
答案 0 :(得分:5)
当你以“原始”方式访问它时,当JSF尚未(自动)创建bean时,它将返回null
。
如果你想确保JSF自动创建bean,那么你应该通过其他Application#evaluateExpressionGet()
评估它作为EL表达来访问它:
public static SessionManager getSessionManager() {
FacesContext context = FacesContext.getCurrentInstance();
return (SessionManager) context.getApplication().evaluateExpressionGet(context, "#{sessionManager}", SessionManager.class);
}
然而,规范(以及更具说明性)的方式是将它作为@ManagedProperty
注入到目标bean中(在封面下基本上与上面相同)。
@ManagedBean
@RequestScoped
public class SomeBean {
@ManagedProperty("#{sessionManager}")
private SessionManager sessionManager; // +setter
}
CDI @Named
+ @Inject
通过不要求设置者和注释值使其更加干净。
@Named
@RequestScoped
public class SomeBean {
@Inject
private SessionManager sessionManager;
}
@Named
@SessionScoped
public class SessionManager implements Serializable {
}