跳到主要内容

Controller Advice

DeepSeek V3 中英对照 Controller Advice

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

@ControllerAdvice 通过元注解 @Component 进行标记,因此可以通过组件扫描注册为 Spring bean。@RestControllerAdvice 则通过元注解 @ControllerAdvice@ResponseBody 进行标记,这意味着 @ExceptionHandler 方法的返回值将通过响应体消息转换进行渲染,而不是通过 HTML 视图。

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

@ControllerAdvice 注解具有一些属性,可以让你缩小它们所应用的控制器和处理器的范围。例如:

// 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 {}
java

前面示例中的选择器在运行时进行评估,如果广泛使用可能会对性能产生负面影响。有关更多详细信息,请参阅 @ControllerAdvice 的 Javadoc。