对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

控制员建议

@ExceptionHandler,@InitBinder@ModelAttribute方法仅适用于@Controller类别,或类别层级,它们被宣布为该类别。如果相反,他们 在@ControllerAdvice@RestControllerAdvice然后他们申请 对任何控制者来说都是如此。此外,截至5.3,@ExceptionHandler方法@ControllerAdvice可用于处理来自任意的异常@Controller或者任何其他驯养者。spring-doc.cadn.net.cn

@ControllerAdvice是元注释,记为@Component因此可以被注册为 通过组件扫描实现 Spring bean 。@RestControllerAdvice是元注释,记为@ControllerAdvice@ResponseBody,这意味着@ExceptionHandler方法终将有回报 通过响应正文消息转换而非HTML视图来实现。spring-doc.cadn.net.cn

启动时,请求映射处理映射ExceptionHandlerExceptionResolver检测 控制器建议,在运行时应用它们。全球@ExceptionHandler方法 来自@ControllerAdvice局部的 ,之后从@Controller. 相比之下,全局@ModelAttribute@InitBinder方法优先于本地方法。spring-doc.cadn.net.cn

@ControllerAdvice注释有属性,可以让你缩小控制器的范围 以及他们申请的控者。例如: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