コントローラーのアドバイス
通常、@ExceptionHandler
、@InitBinder
、@ModelAttribute
メソッドは、それらが宣言されている @Controller
クラス(またはクラス階層)内に適用されます。このようなメソッドを(コントローラー全体で)よりグローバルに適用する場合は、@ControllerAdvice
または @RestControllerAdvice
のアノテーションが付けられたクラスで宣言できます。
@ControllerAdvice
には @Component
のアノテーションが付けられます。これは、そのようなクラスをコンポーネントスキャンを通じて Spring Bean として登録できることを意味します。@RestControllerAdvice
は、@ControllerAdvice
と @ResponseBody
の両方でアノテーションが付けられた合成アノテーションです。これは本質的に、@ExceptionHandler
メソッドがメッセージ変換 (ビュー解決またはテンプレートレンダリングではなく) を通じてレスポンス本文にレンダリングされることを意味します。
起動時に、@RequestMapping
および @ExceptionHandler
メソッドのインフラストラクチャクラスは、@ControllerAdvice
アノテーションが付けられた Spring Bean を検出し、実行時にそれらのメソッドを適用します。グローバル @ExceptionHandler
メソッド(@ControllerAdvice
から)はローカルメソッド(@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])
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 {}
前の例のセレクターは実行時に評価され、広範囲に使用するとパフォーマンスに悪影響を与える可能性があります。詳細については、@ControllerAdvice
javadoc を参照してください。