1

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

我得到 javax.el.E​​LException: Caused by: java.lang.NullPointerException at 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。如何解决?谢谢

4

1 回答 1

0

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

问题中没有提到您的具体功能要求,并且到目前为止发布的代码中的整个设计实际上没有任何意义(我无法想象任何明智的现实世界用例),因此很难向您提出正确的解决方案. 您能得到的最好的结果是添加空检查的建议。

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

顺便说一句,您应该非常小心地以这种方式突然清空会话映射。JSF 将视图范围和会话范围的托管 bean 存储在其中,并且它也被 flash 范围使用。

于 2012-11-03T00:00:08.633 回答