此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

控制器通知

@ExceptionHandler, @InitBinder, 和 @ModelAttribute 方法仅适用于声明它们的 @Controller 类或类层次结构。如果它们是在 @ControllerAdvice@RestControllerAdvice 类中声明的,那么它们适用于任何控制器。此外,从 5.3 版本开始,@ExceptionHandler 方法在 @ControllerAdvice 中可以用来处理任何 @Controller 或其他处理器抛出的异常。spring-doc.cadn.net.cn

@ControllerAdvice 通过 @Component 进行了元注解,因此可以通过组件扫描作为Spring bean进行注册。spring-doc.cadn.net.cn

@RestControllerAdvice 是一个快捷注解,它结合了 @ControllerAdvice@ResponseBody,实际上就是一个 @ControllerAdvice,其异常处理方法会将内容渲染到响应体中。spring-doc.cadn.net.cn

启动时,RequestMappingHandlerMappingExceptionHandlerExceptionResolver 会检测控制器建议 Bean 并在运行时应用它们。全局 @ExceptionHandler 方法,从 @ControllerAdvice 中,会在本地方法(来自 @Controller)之后应用。相比之下,全局 @ModelAttribute@InitBinder 方法会在本地方法之前应用。spring-doc.cadn.net.cn

默认情况下,@ControllerAdvice@RestControllerAdvice 适用于任何控制器, 包括 @Controller@RestController。使用注解的属性来缩小 它们适用的控制器和处理器集。例如:spring-doc.cadn.net.cn

// 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。spring-doc.cadn.net.cn