在ExternalContext中访问@SessionScoped @ManagedBean类#getSessionMap()返回null

时间:2015-04-27 07:44:28

标签: jsf managed-bean session-scope

我试图从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
}
}

我不知道我做错了什么。任何人都可以为此提供合适的解决方案吗?

1 个答案:

答案 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 {

}