|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
控制员建议
@ExceptionHandler,@InitBinder和@ModelAttribute方法仅适用于@Controller类别,或类别层级,它们被宣布为该类别。如果相反,他们
在@ControllerAdvice或@RestControllerAdvice然后他们申请
对任何控制者来说都是如此。此外,截至5.3,@ExceptionHandler方法@ControllerAdvice可用于处理来自任意的异常@Controller或者任何其他驯养者。
@ControllerAdvice是元注释,记为@Component因此可以被注册为
通过组件扫描实现 Spring bean 。@RestControllerAdvice是元注释,记为@ControllerAdvice和@ResponseBody,这意味着@ExceptionHandler方法终将有回报
通过响应正文消息转换而非HTML视图来实现。
启动时,请求映射处理映射和ExceptionHandlerExceptionResolver检测
控制器建议,在运行时应用它们。全球@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。