SpringBootーControllerAdvice

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";
    }
}