@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Component public @interface ControllerAdvice
@Controller クラス間で共有される @ExceptionHandler、@InitBinder、@ModelAttribute メソッドを宣言するクラスの @Component の特殊化。@ControllerAdvice アノテーションが付けられたクラスは、Spring Bean として明示的に宣言するか、クラスパススキャンを介して自動検出できます。このような Bean はすべて、Ordered セマンティクスまたは @Order/@PrioritySE 宣言に基づいてソートされ、Ordered セマンティクスが @Order / @Priority 宣言よりも優先されます。次に、@ControllerAdvice Bean が実行時にこの順序で適用されます。ただし、PriorityOrdered を実装する @ControllerAdvice Bean は、Ordered を実装する @ControllerAdvice Bean よりも優先されないことに注意してください。さらに、Ordered は、スコープ付き @ControllerAdvice Bean には適用されません。たとえば、そのような Bean がリクエストスコープまたはセッションスコープの Bean として構成されている場合などです。例外を処理するために、@ExceptionHandler は、一致する例外ハンドラーメソッドを使用して最初のアドバイスで選択されます。モデル属性とデータバインディングの初期化の場合、@ModelAttribute メソッドと @InitBinder メソッドは @ControllerAdvice の順序に従います。
メモ: @ExceptionHandler メソッドの場合、特定のアドバイス Bean のハンドラーメソッドの中で、現在の例外の原因を単に一致させるよりも、ルート例外の一致が優先されます。ただし、優先度の高いアドバイスの原因の一致は、優先度の低いアドバイスの Bean の一致よりも優先されます(ルートレベルまたは原因レベルのいずれか)。結果として、優先ルートアドバイス Bean に対応する順序でプライマリルート例外マッピングを宣言してください。
デフォルトでは、@ControllerAdvice のメソッドはすべてのコントローラーにグローバルに適用されます。annotations()、basePackageClasses()、basePackages()(またはそのエイリアス value())などのセレクターを使用して、対象のコントローラーのより狭いサブセットを定義します。複数のセレクターが宣言されている場合は、ブール OR ロジックが適用されます。つまり、選択されたコントローラーは少なくとも 1 つのセレクターと一致する必要があります。セレクターチェックは実行時に実行されるため、多くのセレクターを追加すると、パフォーマンスに悪影響を及ぼし、複雑さが増す可能性があることに注意してください。
Controller, RestControllerAdvice| 修飾子と型 | オプションの要素と説明 |
|---|---|
ClassSE<? extends AnnotationSE>[] | annotations アノテーション型の配列。 |
ClassSE<?>[] | assignableTypes クラスの配列。 |
ClassSE<?>[] | basePackageClasses@ControllerAdvice アノテーション付きクラスによって通知されるコントローラーを選択するパッケージを指定するための、basePackages() の型安全な代替。 |
StringSE[] | basePackages 基本パッケージの配列。 |
StringSE[] | valuebasePackages() 属性のエイリアス。 |
@AliasFor(value="basePackages") public abstract StringSE[] value
basePackages() 属性のエイリアス。 より簡潔なアノテーション宣言を可能にします。— たとえば、@ControllerAdvice("org.my.pkg") は @ControllerAdvice(basePackages = "org.my.pkg") と同等です。
basePackages()@AliasFor(value="value") public abstract StringSE[] basePackages
これらの基本パッケージまたはそのサブパッケージに属するコントローラーが含まれます。たとえば、@ControllerAdvice(basePackages = "org.my.pkg") または @ControllerAdvice(basePackages = {"org.my.pkg", "org.my.other.pkg"}) です。
value() はこの属性のエイリアスであり、アノテーションをより簡潔に使用できるようにします。
文字列ベースのパッケージ名の型安全な代替として basePackageClasses() を使用することも検討してください。
public abstract ClassSE<?>[] basePackageClasses
@ControllerAdvice アノテーション付きクラスによって通知されるコントローラーを選択するパッケージを指定するための、basePackages() の型安全な代替。この属性によって参照される以外の目的を果たさない特別なノーオペレーションマーカークラスまたはインターフェースを各パッケージに作成することを検討してください。
public abstract ClassSE<?>[] assignableTypes
指定された型の少なくとも 1 つに割り当て可能なコントローラーは、@ControllerAdvice アノテーション付きクラスによって通知されます。
public abstract ClassSE<? extends AnnotationSE>[] annotations
提供されたアノテーション型の少なくとも 1 つでアノテーションが付けられたコントローラーは、@ControllerAdvice アノテーション付きクラスによって通知されます。
カスタム構成アノテーションの作成を検討するか、@RestController などの事前定義アノテーションを使用してください。