我使用tomcat 7.0和JSF 2.1,当我在我的.xhtml页面中调用类似的东西时,我遇到了问题:#{homePage.get("userName")}
我得到javax.el.ELException:引起: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。怎么解决? 谢谢
答案 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,它也被闪存范围使用。