【Spring MVC】例外ハンドリングを行う方法その1(web.xmlの使用)

概要

Spring MVCを使用したWebアプリケーションにて、例外ハンドリングを行う方法についてまとめた。
例外ハンドリングはweb.xmlまたはHandlerExceptionResolverの実装によって行う。

当記事では例外がどういったところで発生するのか、またweb.xmlを使用してどのようハンドリングするのかについて紹介する。

 

例外の発生場所

Spring MVCを使用したWebアプリケーションでは以下の場所で例外が発生する可能性がある。
また、場所によってハンドリングする方法も異なる。

・Servlet Filter
・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>	

 

<error-code>500</error-code>
<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>java.io.IOException</exception-type>

<exception-type>タグにより、例外の型にあわせてハンドリングする。
上記はIOExceptionが発生した場合のハンドリングを行っている。

 

すべての未処理エラー指定

ハンドリングしていないすべてのエラーを指定する場合。

web.xml


<!-- デフォルトエラー -->		
<error-page>		
	<location>/WEB-INF/views/errors/default_error.jsp</location>	
</error-page>		

ハンドリングできていない想定外の例外が発生した場合、スタックトレースがクライアントに露出してしまう
アプリケーションの内部情報が見られてしまう危険性があるため、スタックトレースの露出は防ぐ必要がある

上記のように指定することで、想定外なエラーが起きた場合でもスタックトレースを表示することなく一律でデフォルトエラー画面に遷移させることができる。

スポンサーリンク