リクエストの処理中にスローされた例外の場合、Spring には例外ハンドラーを登録するさまざまな方法があります。ビューのレンダリング中に例外がスローされたときに、同様の例外処理を適用する方法はありますか? 少なくとも、ロギングを実行できる機能が必要です。
1 に答える
問題は、ビューのレンダリング中にスローされた例外が非常に多くのことを実行できないことです。特に、通常、エラー レポートを含む HTML ページをレンダリングすることはできません。また、5xx 応答を送信することさえできません。通常、応答は例外がスローされる前に「コミット」されているためです。
したがって、(おそらく)できる最善のことは次のとおりです。
- 例外をキャッチしてログに記録する View オブジェクトのラッパーを作成する、または
- サーブレットフィルターでロギングを行い、
ただし、キャッチされない例外をとにかくログに記録するように Web コンテナーを構成できる可能性があります。
アップデート
spring の HandlerInterceptor クラスが、例外がスローされたときに呼び出される「afterCompletion」メソッドを公開していることに気付きました。これとフィルターを使用する利点について何か考えはありますか?
試してみてください。:-)しかし、次のことを考えると、うまくいくとは思えません。
フィルターまたはインターセプターを使用しても、jsp のレンダリング中にスローされた例外に対しては機能しません。エラーが出力されます:
Dec 16, 2012 12:18:03 PM org.apache.catalina.core.ApplicationDispatcher
invoke SEVERE: Servlet.service() for servlet jsp threw exception
javax.el.PropertyNotFoundException: Property 'fooo' not found on
type java.lang.String"
残念ながら、例外はフィルターにまで伝播されません。エラー通知を送信し、失敗したリクエストに関する追加情報をログに記録する独自のログを追加したいと思います。エラーを見つけるためにログ ファイルを監視することは、適切なオプションではありません。
可能性として、ログ メッセージは実際にはログ サブシステムを使用して生成されます。そうである場合は、ロギング構成を使用して、JSP エンジンのロギング イベント用の独自のハンドラーを追加し、特別な通知を送信できます。
例外が 1) JSP ビューのレンダリング中にスローされ、2) JSP エンジンがそれらを伝播していないという事実は、(IMO) それらをキャッチする方法がある可能性が低いことを意味します。
もう 1 つのオプションは、ログ ファイルのスキャナを設定することです...一般的なシステム監視の一環として。