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

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)

我不知道我做错了什么.谁能为此提供合适的解决方案?

Bal*_*usC 5

当您以"原始"方式访问它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)