6

データを保存するときに新しいアイテムを追加するページがあり、「データが正常に保存されました」というメッセージを表示する別のページに移動します。メッセージがリクエストスコープに属していることを読んだので、フラッシュスコープを使用しています。

context.addMessage("calendarGameForm:growl", new FacesMessage("Data was saved successful");
context.getExternalContext().getFlash().setKeepMessages(true);
return outcome;

これは、最初のページの保存ボタンによって呼び出されますaddSeason.xhtml

<p:commandButton id="save" action="#{controller.add}"
                 value="#{msg.save}" ajax="true"
                 type="submit" update="@form"/>

ナビゲーション ルールは次のように定義されます。

<navigation-rule>
    <from-view-id>/competitions/addSeason.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
    <navigation-case>
        <from-outcome>fail</from-outcome>
        <to-view-id>/competitions/calendarGame.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

しかし、ターゲット ページcalendarGame.xhtmlでメッセージが表示されません。

<p:growl id="growl" globalOnly="true" sticky="true"/>

サーバーログにもこの警告が表示されます。

WARNING [javax.enterprise.resource.webcontainer.jsf.flash] (ajp--127.0.0.1-8009-1) JSF1095: フラッシュの送信 Cookie を設定しようとした時点で、応答は既にコミットされていました。フラッシュに保存された値は、次のリクエストでは使用できません。

どうすれば問題を解決できますか?

4

2 に答える 2

6

この問題には 2 つの問題があります。

最初の問題については、faces メッセージをアクション メソッドに追加していて、prerender ビュー中に追加していないことがわかりますよね? があるreturn outcomeので、それが実際のアクション メソッド内にあることは理にかなっています。その場合、JSF1095 メッセージは Mojarra の Ajax エンコーディング関連のバグが原因であり、2.1.11 で修正されています。Mojarra には多くの Flash スコープ関連の問題があり、最後の問題は 2.1.14 で修正されています。Mojarra を少なくともそのバージョンに更新することをお勧めします。現在すでに 2.1.17 です。

2 番目の問題については、aはクライアント ID<p:growl globalOnly="true">を持つメッセージのみを表示します。代わりに、呼び出しをnull修正して passにします。addMessage()null

context.addMessage(null, message);

ナビゲーション前の prerender イベント中に実際に顔メッセージを追加していた場合、問題の原因は異なり、別の解決策が必要になります。とりわけ、この回答を参照してください: Mojarra 2.1.14 flash scope messages and redirect to different path

于 2013-01-16T14:00:13.260 に答える
0

メッセージは、受信ページ/ビューで設定する必要があります。それを行うには、によって呼び出される関数を試してみpreRenderViewEventます。コードを追加する場所があります (他の形式のメッセージ通知を使用することもできます)。

使用例ですpreRenderViewEvent

于 2013-01-16T13:54:02.507 に答える