Sub*_*odh 0 jsf session-scope managed-bean
我试图从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
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么.谁能为此提供合适的解决方案?
当您以"原始"方式访问它null时,它将在JSF尚未(自动)创建bean时返回.
如果你想确保JSF自动创建bean,那么你应该通过以下方式将它作为EL表达式进行评估来访问它Application#evaluateExpressionGet():
public static SessionManager getSessionManager() {
FacesContext context = FacesContext.getCurrentInstance();
return (SessionManager) context.getApplication().evaluateExpressionGet(context, "#{sessionManager}", SessionManager.class);
}
Run Code Online (Sandbox Code Playgroud)
然而,规范(以及更具声明性)的方式是将其作为@ManagedProperty目标bean(在封面下基本上与上面相同)注入它.
@ManagedBean
@RequestScoped
public class SomeBean {
@ManagedProperty("#{sessionManager}")
private SessionManager sessionManager; // +setter
}
Run Code Online (Sandbox Code Playgroud)
CDI @Named+ @Inject通过不需要setter和annotation值使其更加干净.
@Named
@RequestScoped
public class SomeBean {
@Inject
private SessionManager sessionManager;
}
Run Code Online (Sandbox Code Playgroud)
@Named
@SessionScoped
public class SessionManager implements Serializable {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |