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