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 のバグです: issue 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(update)を呼び出してページをレンダリングしていて、そのページがすでにレンダリングされている場合に発生する可能性があります。また、何かを更新すると、どの値が動的に変化します。

多くの理由が考えられるので、はい、コードは重要です。

于 2011-11-18T08:40:17.287 に答える