如何在动作方法完成之前提交响应

时间:2011-11-18 07:55:27

标签: jsf-2 glassfish primefaces mojarra

当调用<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");
        }

    }

2 个答案:

答案 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)来呈现页面并且该页面已经呈现,则会发生这种情况。此外,如果您更新某些内容,哪个值会动态更改。

可能有很多原因,所以是的,代码很重要。