コントローラーのアドバイス

@ExceptionHandler@InitBinder@ModelAttribute メソッドは、それらが宣言されている @Controller クラスまたはクラス階層にのみ適用されます。代わりに、それらが @ControllerAdvice または @RestControllerAdvice クラスで宣言されている場合、すべてのコントローラーに適用されます。さらに、5.3 以降、@ControllerAdvice の @ExceptionHandler メソッドを使用して、任意の @Controller またはその他のハンドラーからの例外を処理できます。

@ControllerAdvice には @Component のメタアノテーションが付けられているため、コンポーネントスキャンを通じて Spring Bean として登録できます。@RestControllerAdvice には @ControllerAdvice および @ResponseBody のメタアノテーションが付けられています。つまり、@ExceptionHandler メソッドの戻り値は、HTML ビューではなくレスポンス本文のメッセージ変換を介してレンダリングされます。

起動時に、RequestMappingHandlerMapping および ExceptionHandlerExceptionResolver はコントローラーアドバイス Bean を検出し、実行時に適用します。@ControllerAdvice からのグローバル @ExceptionHandler メソッドは、@Controller からのローカルメソッドの後に適用されます。対照的に、グローバル @ModelAttribute および @InitBinder メソッドは、ローカルメソッドの前に適用されます。

@ControllerAdvice アノテーションには、適用するコントローラーとハンドラーのセットを絞り込むことができる属性があります。例:

  • Java

  • Kotlin

// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}

// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}

// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = [RestController::class])
class ExampleAdvice1

// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers")
class ExampleAdvice2

// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = [ControllerInterface::class, AbstractController::class])
class ExampleAdvice3

前の例のセレクターは実行時に評価され、広範囲に使用するとパフォーマンスに悪影響を与える可能性があります。詳細については、@ControllerAdvice javadoc を参照してください。