Controller Advice
@ExceptionHandler
、@InitBinder
和 @ModelAttribute
方法仅适用于声明它们的
@Controller
类或类层次结构。如果它们被声明在 @ControllerAdvice
或
@RestControllerAdvice
类中,那么它们将适用于任何控制器。此外,从 5.3 版本开始,
@ControllerAdvice
中的 @ExceptionHandler
方法可以用于处理来自任何 @Controller
或任何其他处理程序的异常。
@ControllerAdvice
使用 @Component
进行元注解,因此可以通过
组件扫描
注册为 Spring bean。
@RestControllerAdvice
是一个快捷注解,它结合了 @ControllerAdvice
和 @ResponseBody
,实际上就是一个 @ControllerAdvice
,其异常处理方法会将内容渲染到响应体。
在启动时,RequestMappingHandlerMapping
和 ExceptionHandlerExceptionResolver
会检测
控制器通知 bean 并在运行时应用它们。来自 @ControllerAdvice
的全局 @ExceptionHandler
方法在来自 @Controller
的本地方法之*后*应用。
相比之下,全局 @ModelAttribute
和 @InitBinder
方法在本地方法之*前*应用。
默认情况下,@ControllerAdvice
和 @RestControllerAdvice
都适用于任何控制器,
包括 @Controller
和 @RestController
。可以使用注解的属性来缩小它们所适用的控制器和处理程序的范围。例如:
-
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。