2016-07-07 8 views
0

Richfacesでonerror属性を使用して、自分のajax要求の例外を処理したいと考えています。そのために私はRichfaces 4.5でonError属性を使用する

<a4j:commandButton value="OK" 
actionListener="#{aBean.handler()}" 
onerror="showNotification();"> 

を使用していたし、私の管理Beanに:私は私のハンドラで例外を投げている

ABean{ 
    public void handler(){ 
     throw new SomeException("Error to the browser"); 
    } 
} 

けれども、私のshowNotification()が呼び出されることはありません。

アプリケーションレベルの例外をonerror属性で処理できますか?このトピックに関するすべてのポインタや例は非常に高く評価されています。あなたがそのonerror属性を読み取ることができdocs

+0

'actionListener ="#{aBean.handler} "' '()'を使わないことを意味しましたか? –

+0

#{aBean.handler()}や#{aBean.handler}の両方の方法で違いはありません。私たちはいませんか? –

+0

はい、この場合ははいですが、私の答えの最後を見てください。 –

答えて

2

作品:

エラーでリクエストの結果が

これは、基本的要求はHTTPエラーで終了しなければならないことを意味します。たとえばHTTP 500のように、サーバーが現時点では使用できないことを意味する可能性があります。それの

例(Javaの):JavaScriptコンソールで

public void handler2() throws IOException { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.getExternalContext().responseSendError(HttpServletResponse.SC_NOT_FOUND, 
      "404 Page not found!"); 
    context.responseComplete(); 
} 

a4j:commandButton(XHTML)

<a4j:commandButton value="OK" actionListener="#{bean.handler2}" 
    onerror="console.log('HTTP error');" /> 

あなたは、 "HTTPエラー" が表示されるはずです。

その他の例外の場合は、oncompleteコードが実行されます。これは、AJAXリクエストが成功するためです。したがって、コード内で例外に反応することができない場合は、自分で処理する必要があります。これを行うには多くの方法があります。あなたが "成功とエラー" を参照してくださいだろうJavaScriptコンソールで

public void handler1() { 
    throw new RuntimeException("Error to the browser"); 
} 

public boolean isNoErrorsOccured() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    return ((facesContext.getMaximumSeverity() == null) || 
       (facesContext.getMaximumSeverity() 
        .compareTo(FacesMessage.SEVERITY_INFO) <= 0)); 
} 

そして、私のoncompleteは次のようになります:このような

<a4j:commandButton value="OK" execute="@this" actionListener="#{bean.handler1}" 
    oncomplete="if (#{facesHelper.noErrorsOccured}) 
     { console.log('success'); } else { console.log('success and error') }" /> 

とハンドラと私はこれを使用しています。


BTW。 actionListener="#{bean.handler3()}"の代わりにactionListener="#{bean.handler3}"と書いてください。その理由は:

public void handler3() { // will work 
    throw new RuntimeException("Error to the browser"); 
} 

// the "real" actionListener with ActionEvent won't work and 
// method not found exception will be thrown 
public void handler3(ActionEvent e) { 
    throw new RuntimeException("Error to the browser"); 
} 
+0

エミールに感謝します。私はエラーレスポンスの一部としてハンドラメソッドから例外の詳細メッセージ/データをブラウザに送信したいだけです。私はconsole.log(exceptionDetails)のようなonerror属性で使うことができます。私はonerror = "console(event.data)"を使用しましたが、コンソールには未定義があります。 –

+0

うれしい私は助けることができます。しかし、これは別の質問です。 _original_質問への私の答えが好きなら、それを受け入れてください。別の質問がある場合は、別のトピックで質問してください。 ( 'eventを使うことはできません。最初に設定していない場合はこのようなデータです)。 –

関連する問題