如何清除JSF中的SessionMap(),而不会在引用此映射时获取null

时间:2012-11-02 22:36:05

标签: jsf-2

我使用tomcat 7.0和JSF 2.1,当我在我的.xhtml页面中调用类似的东西时,我遇到了问题:#{homePage.get("userName")}

我得到javax.el.E​​LException:引起:java.lang.NullPointerException     在mainPacket.HomePageBean.get(HomePageBean.java:35)

我有ManagedBean,如下所示:

@ManagedBean(name = "homePage")
@ViewScoped
public class HomePageBean {
    private Map<String, Object> map;

    public HomePageBean() {
        map= FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        //remove unnecessary values from sessionMap
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().clear();

    }
    public String get(Object s){
        return map.get(s).toString();
    }
}

当我不使用clear时,一切正常。但我想清除sessionMap。怎么解决? 谢谢

1 个答案:

答案 0 :(得分:0)

Java是一种面向对象的语言。每次请求时,它都不会为您提供对象的副本。不,它为您提供了内存中对象实例的引用。在会话映射上调用Map#clear()时,您之前获得的map引用基本上清空,因为它指向完全相同的映射实例你刚刚清空了!

你的具体功能要求在问题中没有提及,到目前为止发布的代码中的整个设计真的没有任何意义(我无法想象任何明智的现实世界用例),所以很难提出你正确的解决方案。最好的方法是添加一个nullcheck的建议。

public String get(Object s){
    Object value = map.get(s);
    return (value != null) ? value.toString() : null;
}

顺便说一句,你应该非常小心地以这种方式突然清空会话地图。 JSF在那里存储视图范围和会话范围的托管bean,它也被闪存范围使用。