JakartaEE サーブレットフィルタと例外処理の連携方法を完全解説!初心者でもわかるエラーハンドリング
生徒
「先生、サーブレットでエラーが出たときにどうやって処理すればいいんですか?」
先生
「良い質問だね。JakartaEEではフィルタを使って例外処理をまとめて管理することができるんだ。これによって、各サーブレットにエラーハンドリングのコードをたくさん書かなくても済むんだよ。」
生徒
「なるほど!じゃあ、フィルタで例外をキャッチしてエラーページに転送するみたいなことができるんですか?」
先生
「その通り!エラーが起きたらフィルタで例外を捕まえて、ログを残したり、統一されたエラーページにフォワードしたりできるんだ。実装方法を見ていこう。」
1. サーブレットフィルタと例外処理の役割
JakartaEEのサーブレットフィルタは、リクエストやレスポンスに対して前処理や後処理を追加できる仕組みです。通常はログ記録やエンコーディング設定、セキュリティチェックなどに使われますが、例外処理の統合にも活用できます。アプリケーション全体のエラーハンドリングをフィルタでまとめることで、可読性が高まり、保守性も向上します。
2. 例外処理フィルタの仕組み
フィルタのdoFilterメソッド内でリクエストを処理するとき、通常はchain.doFilter()を呼び出します。この呼び出しの中で発生する例外をtry-catchで捕まえて、適切な処理を行うことが可能です。例えば、IOExceptionやServletExceptionをログ出力した上でエラーページへ転送する、といった使い方が典型的です。
3. 例外処理フィルタの実装例
以下はサーブレットフィルタで例外をキャッチして、ログを記録した後にエラーページへフォワードするサンプルです。
@WebFilter("/*")
public class ExceptionHandlingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace(); // ログ出力
request.setAttribute("errorMessage", e.getMessage());
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
}
このフィルタを設定すると、アプリ全体で発生する例外を共通的にキャッチし、エラーページへ誘導できます。
4. エラーページの作成
次に、フィルタで転送先となるエラーページを作成します。ここではJSPを利用し、ユーザーにわかりやすいエラーメッセージを表示しましょう。
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>エラーが発生しました</title>
</head>
<body>
<h2>申し訳ありません。エラーが発生しました。</h2>
<p>エラーメッセージ: ${errorMessage}</p>
</body>
</html>
これでアプリケーションの例外が発生した際に、統一されたエラーページを表示できるようになります。
5. 例外処理フィルタを使うメリット
- アプリ全体のエラーハンドリングを一元管理できる
- サーブレットごとにエラーロジックを書く必要がなくなる
- ログの記録や通知処理を統合できる
- ユーザーに統一されたエラーメッセージを提供できる
6. 導入時の注意点
例外処理フィルタを導入するときは、全ての例外をまとめて処理するため、想定外のエラーが隠れてしまう可能性があります。そのため、重大な例外はログに詳細を残しつつ、ユーザーには必要最低限の情報を伝えるように設計することが大切です。また、セキュリティ面からスタックトレースを直接画面に出さない工夫も必要です。