控制器通知
@ExceptionHandler
、@InitBinder
和 @ModelAttribute
方法仅应用于声明它们所在的 @Controller
类或类层次结构。如果它们声明在 @ControllerAdvice
或 @RestControllerAdvice
类中,则应用于任何控制器。此外,从 5.3 版本开始,@ControllerAdvice
中的 @ExceptionHandler
方法可以用来处理来自任何 @Controller
或任何其他处理器的异常。
@ControllerAdvice
使用 @Component
进行了元注解,因此可以通过 组件扫描 注册为 Spring Bean。@RestControllerAdvice
使用 @ControllerAdvice
和 @ResponseBody
进行了元注解,这意味着 @ExceptionHandler
方法的返回值将通过响应体消息转换来渲染,而不是通过 HTML 视图。
在启动时,RequestMappingHandlerMapping
和 ExceptionHandlerExceptionResolver
会检测控制器通知 Bean 并在运行时应用它们。来自 @ControllerAdvice
的全局 @ExceptionHandler
方法在来自 @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])
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。