控制器建议
[请参阅Reactive框架中的对应内容](../../webflux/
controller/ann-advice.md)
@ExceptionHandler、@InitBinder 和 @ModelAttribute 方法仅适用于声明它们的 @Controller 类或类层次结构。如果这些方法是在 @ControllerAdvice 或 @RestControllerAdvice 类中声明的,那么它们将适用于任何控制器。此外,从 Spring Framework 5.3 开始,@ControllerAdvice 中的 @ExceptionHandler 方法可以用来处理来自任何 @Controller 或其他处理器(handler)的异常。
@ControllerAdvice 被元注释 @Component,因此可以通过 组件扫描 注册为 Spring bean。
@RestControllerAdvice 是一个快捷注解,它将 @ControllerAdvice 与 @ResponseBody 结合在一起,实际上就是一种 @ControllerAdvice,但其异常处理方法的结果会直接作为响应体返回。
在启动时,RequestMappingHandlerMapping和ExceptionHandlerExceptionResolver会检测控制器建议(controller advice)bean,并在运行时应用它们。来自@ControllerAdvice的全局@ExceptionHandler方法会在来自@Controller的本地@ExceptionHandler方法之后被应用。相比之下,全局@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。