Richfaces 3.2.2を使用しており、例外が発生したときにユーザーに500エラーページを表示する必要があります。問題は、ajaxイベントを使用すると、例外が発生したときに500エラーをユーザーに表示できないことです。web.xmlでエラーページをすでに定義しました。
すみません、私の英語。何か提案がありますか?
RichFaces開発者ガイドの5.10.1章を確認してください。
5.10.1リクエストエラーの処理
Ajaxリクエスト中にエラーが発生した場合にクライアントで独自のコードを実行するには、標準の「A4J.AJAX.onError」メソッドを再定義する必要があります。
A4J.AJAX.onError = function(req, status, message){ window.alert("Custom onError handler "+message); }
このように定義された関数は、パラメーターとして受け入れます。
req
-エラーを呼び出すリクエストのparams文字列status
-サーバーから返されたエラーの数message
-指定されたエラーのデフォルトメッセージしたがって、タイムアウトや内部サーバーエラーなどで呼び出される独自のハンドラーを作成することができます。
したがって、サーバーで生成されたエラー応答を表示するには、次のようにします。
A4J.AJAX.onError = function(req, status, message){
document.open();
document.write(req.responseText);
document.close();
}
エラーページにリダイレクトするには、次のようにします。
A4J.AJAX.onError = function(req, status, message){
window.location = 'error.jsf';
}
Odelyaが提案したように、必須のエラーの詳細をリクエストパラメータとして渡すか、サーバー側にセッションに保存させるだけで済みます。
おそらくJSF2ではなくJSF1.2を使用しているので、を使用FaceletViewHandler
して例外を処理できます。
public class CustomViewHandler extends FaceletViewHandler {
...
@Override
protected void handleRenderException(FacesContext context, Exception ex) throws IOException, ELException,
FacesException {
try {
..
getSessionMap().put("GLOBAL_ERROR", ex);
getHttpResponseObject().sendRedirect("/error.jsf");
} catch (IOException e) {
log.fatal("Couldn't redirect to error page", e);
}
}
}
もちろん、Beanで処理する必要があります。セッションから例外を抽出するだけです。
Throwable ex = (Exception) getSessionMap().remove("GLOBAL_ERROR");