0

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

    }
4

2 回答 2

2

这是 Mojarra 2.1.x 中的一个错误:问题 2215。会话创建尽可能推迟,以避免不必要的会话创建。但是,他们没有考虑到需要在提交响应之前创建会话。只要页面大于响应的默认缓冲区大小,就会自动提交响应。

您可以在添加 <h:form> 导致 java.lang.IllegalStateException: Cannot create a session after the response has been committed中找到几种解决方法。


与具体问题无关:您应该使用会话范围的 bean,而不是手动摆弄会话映射。

于 2011-11-18T13:13:29.740 回答
0

如果您正在调用 ajax(更新)来呈现页面并且该页面已经呈现,则可能会发生这种情况。此外,如果您更新某些内容,则哪个值会动态变化。

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

于 2011-11-18T08:40:17.287 回答