HandlerInterceptorで実装する。HandlerInterceptorは、リクエストにマッピングされたハンドラメソッドが決定した後に呼び出されるので、アプリケーションが許可しているリクエストに対してのみ共通処理を行うことができる。HandlerInterceptorでは以下の3つのポイントで処理を実行することが出来る。メソッドとして実装する。メソッドとして実装する。メソッドとして実装する。以下に、HandlerInterceptorのサンプルを示す。サンプルコードでは、Controllerの処理が正常終了した後にinfoレベルのログを出力している。子クラスとしてHandlerInterceptorを作成している。インタフェースの空実装を提供しているため、子クラスで不要なメソッドの実装をしないで済む。(2)作成したHandlerInterceptorを適用するパスのパターンを指定する。(3)作成したHandlerInterceptorを適用しないパスのパターンを指定する。Controllerの共通処理の実装¶ここでいう共通処理とは、すべてのControllerで共通的に実装する必要がある処理のことを指す。HandlerMethodArgumentResolverを実装してControllerの引数として受け取れるようにする。以下に、HandlerMethodArgumentResolverのサンプルを示す。共通的なリクエストパラメータをJavaBeanに変換してControllerのメソッドで受け取れるようにしている。説明(1)共通パラメータを保持するJavaBean。インタフェースを実装する。(3)処理対象とする型を判定する。例では、共通パラメータを保持するJavaBeanの型がControllerの引数として指定されていた場合に、このクラスのresolveArgumentメソッドが呼び出される。(4)リクエストパラメータから値を取得し、共通パラメータを保持するJavaBeanに設定し返却する。(5)Controllerのハンドラメソッドの引数に共通パラメータを保持するJavaBeanを指定する。(4)で返却されるオブジェクトが渡される。Note全てのControllerのハンドラメソッドで共通的に渡すパラメータがある場合は、HandlerMethodArgumentResolverを使ってJavaBeanに変換してから渡す方法が有効的である。ここでいうパラメータとは、リクエストパラメータに限らない。複数のControllerで実行したい共通的な処理を実装する。付与したメソッドで実装した処理を、複数のControllerに適用する事ができる。全てのControllerに処理が適用される仕組みになっていたため、アプリケーション全体の共通処理しか実装できなかった。共通処理を適用するControllerを柔軟に指定する事ができるように改善されている。この改善により、様々な粒度で共通処理を実装する事ができるようになった。以下に、共通処理を適用するControllerを指定する方法(属性の指定方法)について説明する。説明と指定例(1)annotationsアノテーションを指定する。指定したアノテーションが付与されたControllerに対して共通処理が適用される。WelcomeControllerとLoginControllerに共通処理が適用される。(2)assignableTypesクラス又はインタフェースを指定する。指定したクラス又はインタフェースに割り当て可能(キャスト可能)なControllerに対して共通処理が適用される。本属性を使用する場合は、共通処理を適用するControllerであることを示すためのマーカーインタフェースを属性値に指定するスタイルを採用することを推奨する。このスタイルを採用した場合、Controller側では、適用したい共通処理用のマーカーインタフェースを実装するだけでよい。SampleControllerに共通処理が適用される。(3)basePackageClassesクラス又はインタフェースを指定する。指定したクラス又はインタフェースのパッケージ配下のControllerに対して共通処理が適用される。本属性を使用する場合は、@ControllerAdviceを付与したクラスパッケージを識別するためのマーカーインタフェースを属性値に指定するスタイルを採用することを推奨する。SampleControllerに共通処理が適用される。パッケージを識別するためのマーカインタフェースを用意すればよい。(4)basePackagesパッケージ名を指定する。指定したパッケージ配下のControllerに対して共通処理が適用される。...}(5)valuebasePackagesへのエイリアス。basePackages属性を指定した際と同じ動作となる。存在しないパッケージを指定してしまう事を防ぐことが出来るIDE上で行ったパッケージ名変更と連動することが出来るため、タイプセーフな指定方法と言える。以下に、@InitBinderメソッドの実装サンプルを示す。説明(1)@ControllerAdviceアノテーションを付与することで、ControllerAdviceのBeanであることを示している。(2)@Orderアノテーションを付与することで、共通処理が適用される優先度を指定する。複数のControllerAdviceに依存関係があるなど、ControllerAdviceに順序性を持たせたい場合は必ず指定すること。順序性を持たせる必要がなければ指定しなくてもよい。(3)@InitBinderメソッドを実装する。全てのControllerに対して@InitBinderメソッドが適用される。以下に、@ExceptionHandlerメソッドの実装サンプルを示す。ハンドリングしてロックエラー画面のViewを返却している。説明(1)@ExceptionHandlerメソッドを実装する。全てのControllerに対して@ExceptionHandlerメソッドが適用される。以下に、@ModelAttributeメソッドの実装サンプルを示す。説明(1)@ModelAttributeメソッドを実装する。全てのControllerに対して@ModelAttributeメソッドが適用される。(2)@ModelAttributeメソッドで生成されたオブジェクトが渡る。同じ処理が複数回実行されてしまう可能性があるため、二重送信を防止するための対策は必ず行うこと。MVCのデフォルトの動作では、モデル(フォームオブジェクトやドメインオブジェクトなど)はセッションには格納されない。セッションに格納したい場合は、@SessionAttributesアノテーションをControllerクラスに付与する必要がある。@SessionAttributesアノテーションの利用を検討すること。セッションを使用する際の注意点があるので、そちらを確認した上で@SessionAttributesアノテーションの利用有無を判断すること。