|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
控制器通知
@ExceptionHandler、@InitBinder 和 @ModelAttribute 方法仅适用于声明它们的 @Controller 类或其类层次结构。如果它们改为在 @ControllerAdvice 或 @RestControllerAdvice 类中声明,则适用于任何控制器。此外,自 5.3 版本起,@ControllerAdvice 中的 @ExceptionHandler 方法可用于处理来自任何 @Controller 或其他处理程序的异常。
@ControllerAdvice 使用 @Component 进行了元注解,因此可以通过组件扫描注册为 Spring Bean。@RestControllerAdvice 使用 @ControllerAdvice 和 @ResponseBody 进行了元注解,这意味着 @ExceptionHandler 方法的返回值将通过响应体消息转换进行渲染,而不是通过 HTML 视图。
在启动时,RequestMappingHandlerMapping 和 ExceptionHandlerExceptionResolver 会检测控制器增强(controller advice)bean,并在运行时应用它们。来自 @ExceptionHandler 的全局 @ControllerAdvice 方法会在来自 @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 以获取更多详细信息。