控制器建议

@ExceptionHandler@InitBinder@ModelAttribute方法仅适用于声明它们的@Controller类或类层次结构。如果它们是在@ControllerAdvice@RestControllerAdvice类中声明的,则适用于任何控制器。此外,从5.3版本开始,@ControllerAdvice中的@ExceptionHandler方法可用于处理来自任何@Controller或任何其他处理程序的异常。

@ControllerAdvice是使用@Component元注释的,因此可以通过组件扫描注册为Spring bean。 @RestControllerAdvice使用@ControllerAdvice@ResponseBody元注释,这意味着@ExceptionHandler方法将通过响应体消息转换呈现其返回值,而不是通过HTML视图。

在启动时,RequestMappingHandlerMappingExceptionHandlerExceptionResolver会检测控制器建议bean并在运行时应用它们。来自@ControllerAdvice的全局@ExceptionHandler方法会在本地@Controller的方法之后应用。相比之下,全局@ModelAttribute@InitBinder方法会在本地方法之前应用。

@ControllerAdvice注解具有属性,可让您缩小它们适用的控制器和处理程序集。例如:

  • Java

  • Kotlin

// 目标是所有使用@RestController注解的控制器
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}

// 目标是特定包中的所有控制器
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}

// 目标是可分配给特定类的所有控制器
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
// 目标是所有使用@RestController注解的控制器
@ControllerAdvice(annotations = [RestController::class])
class ExampleAdvice1

// 目标是特定包中的所有控制器
@ControllerAdvice("org.example.controllers")
class ExampleAdvice2

// 目标是可分配给特定类的所有控制器
@ControllerAdvice(assignableTypes = [ControllerInterface::class, AbstractController::class])
class ExampleAdvice3

上述示例中的选择器在运行时进行评估,如果广泛使用可能会对性能产生负面影响。请查看@ControllerAdvice javadoc以获取更多详细信息。