アノテーションインターフェース ControllerAdvice
@Controller
クラス間で共有される @ExceptionHandler
、@InitBinder
、@ModelAttribute
メソッドを宣言するクラスの @Component
の特殊化。@ControllerAdvice
アノテーションが付けられたクラスは、Spring Bean として明示的に宣言するか、クラスパススキャンを介して自動検出できます。このような Bean はすべて、Ordered
セマンティクスまたは @Order
/@Priority
EE 宣言に基づいてソートされ、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 つのセレクターと一致する必要があります。セレクターチェックは実行時に実行されるため、多くのセレクターを追加すると、パフォーマンスに悪影響を及ぼし、複雑さが増す可能性があることに注意してください。
- 導入:
- 3.2
- 作成者:
- Rossen Stoyanchev, Brian Clozel, Sam Brannen
- 関連事項:
オプション要素のサマリー
修飾子と型オプションの要素説明ClassSE<? extends AnnotationSE>[]
アノテーション型の配列。ClassSE<?>[]
クラスの配列。ClassSE<?>[]
@ControllerAdvice
アノテーション付きクラスによって通知されるコントローラーを選択するパッケージを指定するための、basePackages()
の型安全な代替。StringSE[]
基本パッケージの配列。Component.value()
のエイリアス。StringSE[]
basePackages()
属性のエイリアス。
要素の詳細
name
Component.value()
のエイリアス。- 導入:
- 6.1
- デフォルト:
- ""
value
basePackages()
属性のエイリアス。より簡潔なアノテーション宣言を可能にします。— たとえば、
@ControllerAdvice("org.my.pkg")
は@ControllerAdvice(basePackages = "org.my.pkg")
と同等です。- 導入:
- 4.0
- 関連事項:
- デフォルト:
- {}
basePackages
基本パッケージの配列。これらの基本パッケージまたはそのサブパッケージに属するコントローラーが含まれます。たとえば、
@ControllerAdvice(basePackages = "org.my.pkg")
または@ControllerAdvice(basePackages = {"org.my.pkg", "org.my.other.pkg"})
です。value()
はこの属性のエイリアスであり、アノテーションをより簡潔に使用できるようにします。文字列ベースのパッケージ名の型安全な代替として
basePackageClasses()
を使用することも検討してください。- 導入:
- 4.0
- デフォルト:
- {}
basePackageClasses
ClassSE<?>[] basePackageClasses@ControllerAdvice
アノテーション付きクラスによって通知されるコントローラーを選択するパッケージを指定するための、basePackages()
の型安全な代替。この属性によって参照される以外の目的を果たさない特別なノーオペレーションマーカークラスまたはインターフェースを各パッケージに作成することを検討してください。
- 導入:
- 4.0
- デフォルト:
- {}
assignableTypes
ClassSE<?>[] assignableTypesクラスの配列。指定された型の少なくとも 1 つに割り当て可能なコントローラーは、
@ControllerAdvice
アノテーション付きクラスによって通知されます。- 導入:
- 4.0
- デフォルト:
- {}
annotations
ClassSE<? extends AnnotationSE>[] annotationsアノテーション型の配列。提供されたアノテーション型の少なくとも 1 つでアノテーションが付けられたコントローラーは、
@ControllerAdvice
アノテーション付きクラスによって通知されます。カスタム構成アノテーションの作成を検討するか、
@RestController
などの事前定義アノテーションを使用してください。- 導入:
- 4.0
- デフォルト:
- {}