控制器建議
@ExceptionHandler、@InitBinder 和 @ModelAttribute 方法僅適用於它們所宣告的 @Controller 類或類層次結構。如果將它們宣告在 @ControllerAdvice 或 @RestControllerAdvice 類中,則它們適用於任何控制器。此外,從 5.3 版本開始,@ControllerAdvice 中的 @ExceptionHandler 方法可用於處理來自任何 @Controller 或任何其他處理程式的異常。
@ControllerAdvice 被 @Component 元註解標記,因此可以透過元件掃描註冊為 Spring Bean。
@RestControllerAdvice 是一個快捷註解,它將 @ControllerAdvice 與 @ResponseBody 結合在一起,實際上它只是一個 @ControllerAdvice,其異常處理方法會渲染到響應體中。
在啟動時,RequestMappingHandlerMapping 和 ExceptionHandlerExceptionResolver 會檢測控制器通知 Bean 並在執行時應用它們。來自 @ControllerAdvice 的全域性 @ExceptionHandler 方法在來自 @Controller 的區域性方法之後應用。相反,全域性 @ModelAttribute 和 @InitBinder 方法在區域性方法之前應用。
預設情況下,@ControllerAdvice 和 @RestControllerAdvice 都適用於任何控制器,包括 @Controller 和 @RestController。使用註解的屬性來縮小它們適用的控制器和處理程式集合。例如:
-
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。