概要
Spring MVCを使用したWebアプリケーションにて、例外ハンドリングを行う方法についてまとめた。
例外ハンドリングはweb.xmlまたはHandlerExceptionResolverの実装によって行う。
当記事では例外がどういったところで発生するのか、またweb.xmlを使用してどのようハンドリングするのかについて紹介する。
例外の発生場所
Spring MVCを使用したWebアプリケーションでは以下の場所で例外が発生する可能性がある。
また、場所によってハンドリングする方法も異なる。
・Dispatcher Servlet
・アプリケーション内(Controller層以下)
・View(jspなど)
Servlet Filter
サーブレットコンテナ(Tomcatなど)内に存在するフィルター。
フロントコントローラーに到達する前の、主にリクエストとレスポンスの前後処理を担当する機能。
ここで例外が発生した場合、web.xmlによってハンドリングを行う。
Dispatcher Servlet
フロントコントローラー。
主にHandlerExceptionResolverを使用して例外ハンドリングを行う。
アプリケーション内(Controller層以下)
Controller,Service,Repository層など。
try-catchまたはHandlerExceptionResolverを使用して例外ハンドリングを行う。
View(jspなど)
テンプレートエンジンを使用してクライアント側にレスポンスを行う。
ここで例外が発生した場合、web.xmlによってハンドリングを行う。
web.xmlを使用した例外ハンドリング
web.xml(サーブレットコンテナの設定ファイル)を使用して例外ハンドリングを行う方法について紹介する。
<error-page>タグを使用して、各種エラーがサーブレットコンテナに渡された際の挙動を指定することができる。
ステータスコード
ステータスコードを指定してハンドリング場合。
web.xml
<!-- 500エラー -->
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/errors/system_error.jsp</location>
</error-page>
<location>/WEB-INF/views/errors/system_error.jsp</location>
<error-code>タグにより、HTTPステータス500(Internal Server Error)がサーブレットコンテナに渡された場合にハンドリングする。
<location>タグにより、表示するエラー画面を指定する。
例外の型
例外の型を指定してハンドリングする場合。
web.xml
<!-- 例外クラス指定 -->
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/WEB-INF/views/errors/io_error.jsp</location>
</error-page>
<exception-type>タグにより、例外の型にあわせてハンドリングする。
上記はIOExceptionが発生した場合のハンドリングを行っている。
すべての未処理エラー指定
ハンドリングしていないすべてのエラーを指定する場合。
web.xml
<!-- デフォルトエラー -->
<error-page>
<location>/WEB-INF/views/errors/default_error.jsp</location>
</error-page>
ハンドリングできていない想定外の例外が発生した場合、スタックトレースがクライアントに露出してしまう。
アプリケーションの内部情報が見られてしまう危険性があるため、スタックトレースの露出は防ぐ必要がある。
上記のように指定することで、想定外なエラーが起きた場合でもスタックトレースを表示することなく一律でデフォルトエラー画面に遷移させることができる。