此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
控制器建议
@ExceptionHandler
,@InitBinder
和@ModelAttribute
方法仅适用于@Controller
class 或类层次结构,它们在其中声明。相反,如果他们
在@ControllerAdvice
或@RestControllerAdvice
类,然后他们申请
到任何控制器。此外,从 5.3 开始,@ExceptionHandler
methods 中的@ControllerAdvice
可用于处理来自任何@Controller
或任何其他处理程序。
@ControllerAdvice
使用@Component
因此可以注册为
一个 Spring Bean 通过组件扫描。@RestControllerAdvice
使用@ControllerAdvice
和@ResponseBody
,这意味着@ExceptionHandler
方法将返回
值通过响应正文消息转换呈现,而不是通过 HTML 视图呈现。
启动时,RequestMappingHandlerMapping
和ExceptionHandlerExceptionResolver
检测
controller 建议 bean 并在运行时应用它们。全球@ExceptionHandler
方法
从@ControllerAdvice
,将应用于本地 Import,从@Controller
.
相比之下,全球@ModelAttribute
和@InitBinder
方法先于 local 方法应用。
这@ControllerAdvice
annotation 具有允许您缩小控制器集的属性
以及它们应用于的处理程序。例如:
-
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 了解更多详情。