当调用<h:commandLink/>
JSF标记的操作方法时,会显示以下错误消息:
PWC3999: Cannot create a session after the response has been committed
错误消息的含义非常简单,但我的问题是在动作方法完成执行之前如何提交响应。
(此错误仅在某些时间发生,而不是每次单击commandLink时都会发生。)
I use
JSF implementation: Mojarra V2.1.3
JSF component library: Primefaces V2.2.1
Server: GlassFish Open Source Edition V3.1.1 (build 12)
编辑:我附上一些代码,如果这有助于获得解决方案:
标记:
<h:commandLink value="[Log in]"
action="#{headerAndFooterTemplateBacking.loginFilter}"
disabled="#{sessionScope.pk > 0 ? true : false}"
styleClass="#{sessionScope.pk > 0 ? 'disabled' : 'notDisabled'} padding" immediate="true"/>
行动方法:
public void loginFilter() {
String from = FacesContext.getCurrentInstance().getViewRoot().getViewId();
int pk = getSessionMap().get("pk") == null ? -1 : (Integer) (getSessionMap().get("pk"));
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
Object selected = request.getParameter("selected");
if (pk <= 0) {
if (selected != null) {
getSessionMap().put("from", from + "?faces-redirect=true&selected=" + selected);
} else {
getSessionMap().put("from", from + "?faces-redirect=true");
}
getFacesContext().getApplication().getNavigationHandler().
handleNavigation(getFacesContext(), null,
"/pages/login/login.xhtml?faces-redirect=true");
}
}
答案 0 :(得分:2)
这是Mojarra 2.1.x中的一个错误:issue 2215。会话创建尽可能地推迟,以避免不必要的会话创建。但是,他们没有考虑在提交响应之前需要创建会话。只要页面大于响应的默认缓冲区大小,响应就会自动提交。
您可以在Adding <h:form> causes java.lang.IllegalStateException: Cannot create a session after the response has been committed中找到几种解决方法。
无关具体问题:您应该使用会话范围的bean而不是手动摆弄会话映射。
答案 1 :(得分:0)
如果您正在调用ajax(update)来呈现页面并且该页面已经呈现,则会发生这种情况。此外,如果您更新某些内容,哪个值会动态更改。
可能有很多原因,所以是的,代码很重要。