控制器建议
@ExceptionHandler
、@InitBinder
和@ModelAttribute
方法仅适用于声明它们的@Controller
类或类层次结构。如果它们是在@ControllerAdvice
或@RestControllerAdvice
类中声明的,则适用于任何控制器。此外,从5.3版本开始,@ControllerAdvice
中的@ExceptionHandler
方法可用于处理来自任何@Controller
或任何其他处理程序的异常。
@ControllerAdvice
是使用@Component
元注释的,因此可以通过组件扫描注册为Spring bean。 @RestControllerAdvice
使用@ControllerAdvice
和@ResponseBody
元注释,这意味着@ExceptionHandler
方法将通过响应体消息转换呈现其返回值,而不是通过HTML视图。
在启动时,RequestMappingHandlerMapping
和ExceptionHandlerExceptionResolver
会检测控制器建议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以获取更多详细信息。