0

ステートフルページネーション、並べ替えなどをサポートするTableQueryというオブジェクトのテーブルを表示するJSFページがあります。オブジェクトにアクセスするBeanはRequestScopedオブジェクトであり、フラッシュマップを格納することでTableQueryを保持しようとします。アクセサメソッドは次のようになります。

public TableQuery<SysLog> getQuery() {
    if (query != null) return query;
    Flash flash = FacesContext.getCurrentInstance().
            getExternalContext().getFlash();
    query = (TableQuery) flash.get("Query");
    if (query != null) System.out.println("TableSysLog.getQuery() Got query from flash!");
    if (query == null) {
        query = slc.getNewTableQuery();
        System.out.println("TableSysLog.getQuery() Created new query");
    }
    flash.put("Query", query);
    return query; }

ページ間を移動するためのリンクは、p:commandLInkで実装されます。PrimefacesコマンドリンクをAJAXモードで使用しているので、リンクをクリックするとリンクだけが処理されます。アクションリスナーは次のようになります。

public void doNextPage(ActionEvent evt) {
    getQuery().doNextPage();
}

それが機能しないとき、私はエラーメッセージを受け取ります:

WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash.  Any values stored to the flash will not be available on the next request.

この問題を調べたときにこのスレッドを見つけました。記事が示唆しているようにHTTPチャンクをオフにすると、エラーメッセージは消えましたが、問題は残っていました。

誰かが何が起こっているのか、そしてこれがどのように修正されるのか知っていますか?

アップデート:

この問題を処理する中で、フラッシュオブジェクトの保存に使用されるCookieのバグを発見したと思います。保存されるCookieの名前はcsfcfcであり、Cookieへのパスパラメータはアプリケーションのルートであり、私の場合は「/A/」です。

ただし、失敗すると、2番目のcsfcfc cookieが取得されます。今回は、pathパラメーターが「/A//」です。私の理論では、Cookieジェネレーターがパスパラメーターに「/」を追加することがあります。これは、ブラウザーがCookieを送信しても、次のリクエストでCookieが表示されないことを意味します。

これが非常に断続的に発生することは注目に値します。私は常にJSF1095メッセージを受け取るとは限りませんが、見るたびに余分なCookieを受け取ります。

これがMojarraのバグなのかGlassfishのバグなのかはわかりませんが、この投稿にMojarraタグを追加しています。私はそれらの製品のバグデータベースに精通していませんが、ここで誰かが次のステップがどうあるべきかについてコメントできますか?

回避策の提案をいただければ幸いです

4

1 に答える 1

0

質問で提供されたリンクによって示唆されているように、問題はプロトコルハンドラーのGlassfishにあることがわかりました。HTMLの「チャンキング」モードがオフになっている場合、この問題は解消されます。

もともとはそうではないと思っていましたが、実際にはフラッシュオブジェクトが失われる原因となる別のバグがありました。

于 2012-10-12T01:42:22.340 に答える