2012-02-29 11 views
5

例外が発生したときにエラーページにカスタムメッセージを出力したいだけです。jsfの例外処理 - 新しいページにエラーメッセージを出力する

私はerror.xhtmlでこの

if(erroroccured){ 
     FacesMessage message=new FacesMessage("You must login to continue"); 
     context.addMessage(null, message); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml"); 

    } 

を試してみました私は

<h:messages></h:messages> 

に例外が発生するたびに、あまりにも..私のページが完全にリダイレクトされているタグを与えました。しかし、私は何かエラーメッセージを得るdint。

+0

が重複する可能性:[?JSFで自分のアプリケーションのエラーを表示する方法](http://stackoverflow.com/questions/315804/how-to-display-my-applications-errors-in-jsf) – oers

+0

いいえ、その質問は、エラーメッセージmsg、私はカスタムメッセージを印刷するために別のページにリダイレクトする必要がある例外処理について質問しています。しかし、その質問ではリダイレクトは起こりません...私は同じページに検証メッセージを印刷するのに問題はありません..問題は主にリダイレクトにあるようです。.. – Karthikeyan

答えて

8

顔面のメッセージはリクエストスコープです。リダイレクトは、基本的にWebブラウザに新しいHTTPリクエストを送信するように指示します(ブラウザのアドレスバーでURLが変更されていることがわかります)。以前のリクエストで設定されたfacesメッセージは、新しいリクエストではもはや使用できなくなります。

  1. リダイレクトを送信しないでください:

    はそれを動作させるためには、いくつかの方法があります。代わりに転送を送信します。あなたは

    return "error"; 
    
  2. は、一般的なエラーページのマスターテンプレートを作成し、ために別々のテンプレートクライアントを使用するアクションメソッドの内部ですでにしている場合は、ExternalContext#dispatch()

    FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml"); 
    

    によって、あるいは単に通常の方法をナビゲートすることによってそれを行うことができますすべての個々のエラータイプを選択して、メッセージをビューに表示します。

    <ui:composition template="/WEB-INF/templates/error.xhtml" 
        xmlns="http://www.w3.org/1999/xhtml" 
        xmlns:ui="http://java.sun.com/jsf/facelets" 
    > 
        <ui:define name="message"> 
         You must login to continue. 
        </ui:define> 
    </ui:composition> 
    

    次に、redirect("error-login.xhtml")のようなこの特定のエラーページにリダイレクトできます。

  3. redirect("error.xhtml?type=login")のようなリダイレクトURLを使用して、リクエストパラメータとしてエラー識別子を渡して、ビューで処理させます。

  4. フラッシュのスコープにfacesメッセージを保存します。

    externalContext.getFlash().setKeepMessages(true); 
    

    しかし、Mojarraはややバグのあるフラッシュ範囲の実装を持っています。現在のリリースでは、別のフォルダにリダイレクトする必要がある場合は機能しませんが、ターゲットページが同じフォルダにある場合は機能します。

+0

すべてがうまく動作しますが、この例外とは関係ありません.. '応答がコミットされた後sendRedirect()を呼び出すことはできません。 ' – Karthikeyan

+1

コールチェーンのさらに下にあるいくつかのコードは、 'sendRedirect()'(または 'externalContext.redirect()'を呼び出しています。その通話をスキップする必要があります。いくつかのヒントについては、この関連する回答を参照してください:http:// stackoverflow。com/questions/2123514/java-lang-illegalstateexception-for-after-after-after-committee/2125045#2125045 – BalusC