我是 Java 和 JSF 新手。我需要有关 IllegalStateException 的帮助。这是场景:
在我当前的项目中,我有一个用于应用程序菜单的会话范围 bean:
public final class MenuBean implements Serializable{
private MenuModel model;
private FacesContext context = FacesContext.getCurrentInstance();
public MenuModel getModel() {
return model;
}
public MenuBean() {
updateMenu();
}
public void updateMenu(){
Map session = (Map<String,Object>) context.getExternalContext().getSessionMap();
EUser user = (EUser) session.get(UserBean.USER_SESSION_KEY);
...
}
private MethodExpression createMethodExpression(String action) {
...
}
}
在我的逻辑的某个时刻,我需要更新菜单,所以我这样做:
ExternalContext extContext = context.getExternalContext();
Map sMap = (Map<String,Object>) extContext.getSessionMap();
MenuBean menu = (MenuBean) sMap.get("menuBean");
menu.updateMenu();
bean 构造良好,但是当我尝试手动更新它(如上所示)时,我在更新方法的第一行得到 IllegalStateExceptionupdateMenu()
我不明白出了什么问题,因为我可以在第一次构建菜单时使用相同的调用来获取会话映射。
另外,使用 NetBeans 调试器,我可以看到 MenuBean 的实例已正确恢复。
你们能帮我吗?
The FacesContext
存储在HTTP请求线程中。您绝对不应该将其声明并分配为比 HTTP 请求寿命更长的实例的实例变量(最好也不要在它已经基于请求时 - 这是糟糕的设计)。这FacesContext
当 HTTP 请求完成时,实例被释放并失效。在任何后续 HTTP 请求中,该实例不再有效。有非法国家的手段。这解释了IllegalStateException
你看到了。
你需要remove以下行:
private FacesContext context = FacesContext.getCurrentInstance();
并修复您的代码以使其仅在方法块中为线程本地:
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
// ...
您始终可以将其分配为变量,但只能保留线程本地:
FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
// ...
无关针对具体问题,使用@ManagedProperty
在这种特殊情况下就更容易了。
public final class MenuBean implements Serializable {
@ManagedProperty("#{user}")
private EUser user;
// ...
}
然后 JSF 将为您注入它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)