``\ を指定した際に、自動的に登録される\ ``HandlerExceptionResolver``\ によって、ハンドリングされない例外をハンドリングするためのクラス。
| Spring MVCより提供されている\ ``SimpleMappingExceptionResolver``\ を継承し、例外コード及びResultMessagesを、Viewから参照できるように機能追加を行っている。
* - | (14)
- | HandlerException
| ResolverLogging
| Interceptor
- | \ ``HandlerExceptionResolver``\ でハンドリングされた例外を、ログに出力するためのInterceptorクラス。
| 本Interceptorクラスでは、\ ``HandlerExceptionResolver``\ で解決されたHTTPレスポンスコードの分類に応じて、ログの出力レベルを切り替えている。
| 1. "100-399"の場合は、 INFOレベルで出力する。
| 2. "400-499"の場合は、 WARNレベルで出力する。
| 3. "500-"の場合は ERRORレベルで出力する。
| 4. "-99"の場合は ログ出力しない。
| 本Interceptorを使用することで、Spring MVC管理下で発生する全ての例外を、ログに出力することができる。
| ログは、\ ``ExceptionLogger``\ を使用して出力している。
| プロジェクトの要件に応じて\ ``log``\メソッドを拡張することで、デフォルトの挙動を変更してログ出力することが可能である。
* - | (15)
- | ExceptionLogging
| Filter
- | 致命的なエラー、Spring MVC管理外で発生する例外を、ログに出力するためのFilterクラス。
| ログは、すべてERRORレベルで出力する。
| 本Filterを使用した場合、致命的なエラー、およびSpring MVC管理外で発生するすべての例外を、ログに出力することができる。
| ログは、\ ``ExceptionLogger``\ を使用して出力している。
.. raw:: latex
\newpage
.. _exception-handling-about-systemexceptionresolver-label:
SystemExceptionResolverの設定項目について
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
本編で説明していない設定項目について、説明する。
要件に応じて、設定を行うこと。
.. tabularcolumns:: |p{0.05\linewidth}|p{0.15\linewidth}|p{0.15\linewidth}|p{0.45\linewidth}|p{0.20\linewidth}|
.. list-table:: **本編で説明していない設定項目一覧**
:header-rows: 1
:widths: 5 15 15 45 20
:class: longtable
* - 項番
- 項目名
- プロパティ名
- 説明
- デフォルト値
* - | (1)
- | 結果メッセージの属性名
- | resultMessagesAttribute
- | ビジネス例外に設定されているメッセージ情報として、モデルに設定する際の属性名(String)を指定する。
| View(JSP)から結果メッセージにアクセスする際の、属性名となる。
- resultMessages
* - | (2)
- | 例外コード(メッセージID)の属性名
- | exceptionCode
| Attribute
- | 例外コード(メッセージID)として、HttpServletRequestに設定する際の属性名(String)を指定する。
| View(JSP)から例外コード(メッセージID)にアクセスする際の属性名となる。
- exceptionCode
* - | (3)
- | 例外コード(メッセージID)のヘッダ名
- | exceptionCode
| Header
- | 例外コード(メッセージID)として、HttpServletResponseのレスポンスヘッダに設定する際のヘッダ名(String)を指定する。
- X-Exception-Code
* - | (4)
- | 例外オブジェクトの属性名
- | exceptionAttribute
- | ハンドリングした例外オブジェクトとして、モデルに設定する際の属性名(String)を指定する。
| View(JSP)から例外オブジェクトにアクセスする際の属性名となる。
- exception
* - | (5)
- | 本ExceptionResolverとして、使用するハンドラー(Controller)のオブジェクト一覧
- | mappedHandlers
- | 本ExceptionResolverを使用するハンドラーの、オブジェクト一覧(Set)を指定する。
| 指定したハンドラーオブジェクトで発生した例外のみ、ハンドリングが行われる。
| **この設定項目は指定してはいけない。**
- | 指定なし
|
| **指定した場合の動作は、保証しない。**
* - | (6)
- | 本ExceptionResolverを使用するハンドラー(Controller)のクラス一覧
- | mappedHandlerClasses
- | 本ExceptionResolverを使用するハンドラーのクラス一覧(Class[])を指定する。
| 指定したハンドラークラスで発生した例外のみハンドリングが行われる。
| **この設定項目は指定してはいけない。**
- | 指定なし
|
| **指定した場合の動作は、保証しない。**
* - | (7)
- | HTTPレスポンスのキャッシュ制御有無
- | preventResponseCaching
- | HTTPレスポンス時のキャッシュ制御の有無(true:有 false:無)を指定する。
| true:有を指定すると、キャッシュを無効にするためのHTTPレスポンスヘッダが追加される。
- | false:無
.. raw:: latex
\newpage
| (1)-(3)は、\ ``org.terasoluna.gfw.web.exception.SystemExceptionResolver``\ の設定項目。
| (4)は、\ ``org.springframework.web.servlet.handler.SimpleMappingExceptionResolver``\ の設定項目。
| (5)-(7)は、\ ``org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver``\ の設定項目。
結果メッセージの属性名
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| SystemExceptionResolverでハンドリングして設定したメッセージと、アプリケーションコードでハンドリングして設定したメッセージを、View(JSP)で別のmessagesPanelとして出力したい場合は、SystemExceptionResolver専用の属性名を指定する。
| 下記に示す例は、デフォルト値から「resultMessagesForExceptionResolver」に変更する場合の、設定&実装例である。
- **spring-mvc.xml**
.. code-block:: xml
- **jsp**
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 結果メッセージの属性名(resultMessagesAttribute)に、"resultMessagesForExceptionResolver"を指定する。
* - | (2)
- | メッセージ属性名(messagesAttributeName)に、SystemExceptionResolverで設定した属性名を指定する。
例外コード(メッセージID)の属性名
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| デフォルトの属性名をアプリケーションコードで使用している場合は、重複を避けるために、別の値を設定すること。重複がない場合は、デフォルト値を変更する必要はない。
| 下記は、デフォルト値から、「exceptionCodeForExceptionResolver」に変更する場合の、設定&実装例である。
- **spring-mvc.xml**
.. code-block:: xml
- **jsp**
.. code-block:: xml
[${f:h(exceptionCodeForExceptionResolver)}]
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 例外コード(メッセージID)の属性名(exceptionCodeAttribute)に、"exceptionCodeForExceptionResolver"を指定する。
* - | (2)
- | SystemExceptionResolverに設定した値(exceptionCodeForExceptionResolver)を、テスト対象(空チェック対応)の変数名として指定する。
* - | (3)
- | SystemExceptionResolverに設定した値(exceptionCodeForExceptionResolver)を、出力対象の変数名として指定する。
例外コード(メッセージID)のヘッダ名
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| デフォルトのヘッダ名が使用されている場合、重複を避けるために、別の値を設定すること。重複がない場合は、デフォルト値を変更する必要はない。
| 下記は、デフォルト値から「X-Exception-Code-ForExceptionResolver」に変更する場合の、設定&実装例である。
- **spring-mvc.xml**
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 例外コード(メッセージID)のヘッダ名(exceptionCodeHeader)に、"X-Exception-Code-ForExceptionResolver"を指定する。
例外オブジェクトの属性名
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| デフォルトの属性名をアプリケーションコードで使用している場合は、重複を避けるために、別の値を設定すること。重複がない場合は、デフォルト値を変更する必要はない。
| 下記は、デフォルト値から「exceptionForExceptionResolver」に変更する場合の、設定&実装例である。
- **spring-mvc.xml**
.. code-block:: xml
- **jsp**
.. code-block:: xml
[Exception Message]
${f:h(exceptionForExceptionResolver.message)}
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 例外オブジェクトの属性名(exceptionAttribute)に、"exceptionForExceptionResolver"を指定する。
* - | (2)
- | SystemExceptionResolverに設定した値(exceptionForExceptionResolver)を、例外オブジェクトからメッセージを取得するための変数名として、指定する。
.. _exception-handling-http-response-cache:
HTTPレスポンスのキャッシュ制御有無
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
| HTTPレスポンスに、キャッシュ制御用のヘッダを追加したい場合は、true:有を指定する。
- **spring-mvc.xml**
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | HTTPレスポンスのキャッシュ制御有無(preventResponseCaching)に、true:有を指定する。
.. note:: **有を指定した場合のHTTPレスポンスヘッダ**
HTTPレスポンスのキャッシュ制御有無を有にすると、以下のHTTPレスポンスヘッダが出力される。
| Cache-Control:no-store
\ ``SystemExceptionResolver``\によるキャッシュ制御用のヘッダ追加はブラウザキャッシュによる意図しないエラー画面の表示を抑止するためのオプションであるが、Spring Securityの機能を使用してセキュリティの観点からキャッシュ制御用のヘッダを追加することも可能である。
Spring Securityの機能については、:ref:`SpringSecurityLinkageWithBrowser`\を参照されたい。
.. warning:: **SpringSecurityのCache-Controlヘッダを利用する場合の注意点**
\ ``SystemExceptionResolver``\のキャッシュ制御とSpring SecurityのCache-Controlヘッダを有効にした場合、\ ``SystemExceptionResolver``\のキャッシュ制御が優先される。
これにより、正常時はSpring Securityでは\ ``no-store``\以外も付与されるが、例外時は\ ``no-store``\のみ付与されるため、意図したとおりにキャッシュを制御できない恐れがあることに注意されたい。
.. _exception-handling-about-handlerexceptionresolverlogginginterceptor:
HandlerExceptionResolverLoggingInterceptorの設定項目について
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
本編で説明していない設定項目について、説明する。
要件に応じて、設定を行うこと。
.. tabularcolumns:: |p{0.05\linewidth}|p{0.15\linewidth}|p{0.15\linewidth}|p{0.45\linewidth}|p{0.20\linewidth}|
.. list-table:: **本編で説明していない設定項目一覧**
:header-rows: 1
:widths: 5 15 15 45 20
* - 項番
- 項目名
- プロパティ名
- 説明
- デフォルト値
* - | (1)
- | ログ出力対象から除外する例外クラスの一覧
- | ignoreExceptions
- | ``HandlerExceptionResolver`` によってハンドリングされた例外のうち、ログ出力しない例外クラスをリスト形式で指定する。
| 指定した例外クラス及びサブクラスの例外が発生した場合、 本クラスでログの出力は行われない。
| 本項目に指定する例外クラスは、別の場所(別の仕組み)でログ出力される例外のみ指定すること。
- | ``ResultMessagesNotificationException.class``
|
| ``ResultMessagesNotificationException.class`` 及びサブクラスの例外は、 ``ResultMessagesLoggingInterceptor`` でログ出力されるため、デフォルト設定として除外している。
ログ出力対象から除外する例外クラスの一覧
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
プロジェクトで用意した例外クラスをログ出力対象から除外したい場合は、以下のような設定となる。
- **spring-mvc.xml**
.. code-block:: xml
org.terasoluna.gfw.common.exception.ResultMessagesNotificationException
com.example.common.XxxException
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (1)
- | 共通ライブラリのデフォルト設定で指定されている ``ResultMessagesNotificationException`` を除外対象に指定する。
* - | (2)
- | プロジェクトで用意した例外クラスを除外対象に指定する。
|
全ての例外クラスをログ出力対象とする場合は、以下のような設定となる。
- **spring-mvc.xml**
.. code-block:: xml
.. tabularcolumns:: |p{0.10\linewidth}|p{0.90\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 90
* - 項番
- 説明
* - | (3)
- | ignoreExceptionsプロパティに ``null`` を指定する。
| ``null`` を指定すると、全ての例外クラスがログ出力対象となる。
.. _exception-handling-appendix-defaulthandlerexceptionresolver-label:
DefaultHandlerExceptionResolverで設定されるHTTPレスポンスコードについて
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DefaultHandlerExceptionResolverでハンドリングされるフレームワーク例外と、HTTPステータスコードのマッピングを、以下に記載する。
.. tabularcolumns:: |p{0.10\linewidth}|p{0.60\linewidth}|p{0.20\linewidth}|
.. list-table::
:header-rows: 1
:widths: 10 60 20
:class: longtable
* - 項番
- ハンドリングされるフレームワーク例外
- HTTPステータスコード
* - | (1)
- | org.springframework.web.HttpRequestMethodNotSupportedException
- | 405
* - | (2)
- | org.springframework.web.HttpMediaTypeNotSupportedException
- | 415
* - | (3)
- | org.springframework.web.HttpMediaTypeNotAcceptableException
- | 406
* - | (4)
- | org.springframework.web.bind.MissingPathVariableException
- | 500
* - | (5)
- | org.springframework.web.bind.MissingServletRequestParameterException
- | 400
* - | (6)
- | org.springframework.web.bind.ServletRequestBindingException
- | 400
* - | (7)
- | org.springframework.beans.ConversionNotSupportedException
- | 500
* - | (8)
- | org.springframework.beans.TypeMismatchException
- | 400
* - | (9)
- | org.springframework.http.converter.HttpMessageNotReadableException
- | 400
* - | (10)
- | org.springframework.http.converter.HttpMessageNotWritableException
- | 500
* - | (11)
- | org.springframework.web.bind.MethodArgumentNotValidException
- | 400
* - | (12)
- | org.springframework.web.multipart.support.MissingServletRequestPartException
- | 400
* - | (13)
- | org.springframework.validation.BindException
- | 400
* - | (14)
- | org.springframework.web.servlet.NoHandlerFoundException
- | 404
* - | (15)
- | org.springframework.web.context.request.async.AsyncRequestTimeoutException
- | 503
.. raw:: latex
\newpage