2011-09-21 17 views
6

JSFページ(MyFaces 2.0を使用しています)は、最初に表示されるデータ収集の一部です。何らかの情報が見つからない場合は、その旨のメッセージを提供し、別のページにリダイレクトされます。私はここで見つけた解決策を使用しようとしましたPreserving FacesMessage after redirect for presentation through <h:message> in JSF(setKeepMessages(true))、リダイレクト後にメッセージが表示されません。私が選ぶことができる唯一の違いは、ナビゲーションルールを使用していないことです。通常のアクションでは発生していないため、外部コンテキストでredirect()を呼び出しています。リダイレクト後のJSFメッセージの保存

関連するコード:

public void redirectToPageWithMessage(String inPage, String message, FacesMessage.Severity severity){ 
    getFlash().setKeepMessages(true); 
    addMessage(message, severity); 
    try { 
     getFacesContext().getExternalContext().redirect(inPage); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

残念ながら、これは動作していないようです。リダイレクトは正常に行われますが、< messages />タグはメッセージを表示していません。 redirect()がうまくいかないために何か違うことがありますか?

答えて

4

メッセージを保存するコードは、フェーズが終了した後に実行されます(Flash.doPostPhaseActions(FacesContext)を参照)。したがって、動作しないと予想されますが、リダイレクトの前にFlash.doPostPhaseActionsを呼び出すことができます。注意は "クリーンな"解決策ではありませんが、可能です。

+0

結果を返さない関数の中でリダイレクトするより良い方法がありますか(redirect()を呼び出す以外)? – moneyt

0

JSFメッセージは、実際の要求の処理のためにのみ保持されます。リダイレクトを使用すると2番目のリクエストが行われるため、JSFMessagesは失われます。 EL-Flashはこれを回避する方法です。この例はうまくいくはずです:http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/

+3

'setKeepMessages(true)'と 'getFlash()。setKeepMessages(true);'という行の第1段落が間違っていましたか?彼は既に** Flashを使用していますが、 'ExternalContext#redirect()'と組み合わせて正しく動作しません。 – BalusC

0

私は同じ問題を抱えていましたが、ExternalContext.redirect()を使用せずに解決しましたが、あなたの行動の結果を試してみてください。

つまり、私のボタンで呼び出されたアクションは、次のページに進むナビゲーションルールを示すString(結果)を返します。そのシステムでは、メッセージは保存されます。

+1

これで、リダイレクトの代わりに転送するようになりました。そのためには、 'Flash#setKeepMessages()'はもう必要ありません。それとも、実際に使っていなかったのですか? – BalusC

+0

あなたが正しいです、私はそれを使用を停止:)実際には、私はバグ[WELD - 1218](https://issues.jboss.org/browse/WELD-1218)に遭遇したときにそれを発見した。 –