ControllerAdviceとは?
ControllerAdviceとは、エラー処理などをコントローラーの共通処理としてまとめて定義するためのものである。
@Controllerを付与したクラスには、Handlerメソッド(@RequestMappingを付与したメソッド)とは別に、Controller専用の特殊なメソッド( @InitBinderメソッド、@ModelAttributeメソッド、@ExceptionHandlerメソッド )を実装することができる。
コントローラークラス内に定義した場合は、そのコントローラーのみに対して処理が適用されるが、これらのメソッドを複数のControllerクラスで共有したい場合は、@ControllerAdviceを付加したクラスに上記のメソッドを定義する。
@InitBinderメソッド
WebDataBinderオブジェクト(リクエストデータをJavaオブジェクトにバインドするためのオブジェクト)をカスタマイズするためのメソッド。 型変換、フォーマッティング、バリデーションなどをカスタマイズすることができる。
例えば、バインドするデータに対して両端の空白を削除するには以下のように記述する。
@ControllerAdvice public class MyControllerAdvice { @InitBinder public void initBinder(WebDataBinder dataBinder) { dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } }
@ModelAttributeメソッド
Modelにオブジェクトを格納するためのメソッド。 Handlerメソッド実行前に呼び出され、メソッドでなにか値を返却した場合は、返却したオブジェクトがModelに格納される。
MVCにおいて共通のデータを Model に設定したい場合に使用する。
@ControllerAdvice public class MyControllerAdvice { @ModelAttribute public void setTimestamp(Model model) { model.add("timestamp", System.currentTimeMillis()); } }
@ExceptionHandlerメソッド
例外をハンドリングするためのメソッド。
@ExceptionHandlerは、コントローラーでスローされた特定の例外に対しての処理を定義する。 属性に処理対象の例外クラスを指定する。
@ExceptionHandler
の引数に指定した例外がスローされた場合にメソッドが実行される。- 引数に与える例外クラスは複数記述することができる。
- 例外の親クラスを引数に設定した場合は、その例外クラスの子の例外が発生した場合も捕捉される。
(例:引数にRuntimeException.classを指定時にNullPointerExceptionが発生しても例外処理メソッドが実行される)
@ControllerAdvice public class MyControllerAdvice { @ExceptionHandler({ IllegalArgumentException.class }) public String testExceptionHandle(IllegalArgumentException e, Model model) { String stackTrace = ExceptionUtils.getStackTrace(e); model.addAttribute("message0", e); model.addAttribute("message1", stackTrace); return "/exception/runtime"; } }