|
对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
控制器建议
通常,@ExceptionHandler,@InitBinder和@ModelAttribute方法适用
在@Controllerclass(或类层次结构),其中声明了它们。如果你
希望此类方法更全局(跨控制器)应用,您可以在
类用@ControllerAdvice或@RestControllerAdvice.
@ControllerAdvice注释为@Component,这意味着此类类可以是
通过组件扫描注册为 Spring bean。@RestControllerAdvice是带有注释的组合注释
两者兼而有之@ControllerAdvice和@ResponseBody,这本质上意味着@ExceptionHandler方法通过消息转换呈现到响应正文
(与视图分辨率或模板渲染相比)。
启动时,的基础设施类@RequestMapping和@ExceptionHandler方法检测带有@ControllerAdvice然后应用他们的
方法。全球@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])
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 {}
前面示例中的选择器在运行时进行评估,可能会产生负面影响
如果广泛使用,性能。请参阅@ControllerAdvicejavadoc 了解更多详情。