引言
之前发表过一篇 SpringBoot 对 controller 层捕获全局异常并处理的方法(@ControllerAdvice 和 @ExceptionHandler),介绍了如何在 SpringBoot 工程中对 Controller 配置全局异常处理。后来在实际工程中,又有了如下需求:有些接口在发生异常时,需要持久化错误信息,而有的接口则不需要。如果使用了全局异常处理,那每次发生了异常,还需要判断是哪个接口发生的异常,进而选择是否持久化错误日志。那能不能对全局异常进行配置,对不同类型的接口使用不同的全局异常进行处理呢?
经过查阅文档发现,Spring 提供了对 @ControllerAdvice 注解的配置,我们可以通过配置 @ControllerAdvice 指定拦截范围。
@ControllerAdvice 指定 Controller 范围
根据 API,我们可以看到注解 @ControllerAdvice 有如下几种配置:
basePackages
//@ControllerAdvice("cn.myz.demo.controller")
//@ControllerAdvice(value = "cn.myz.demo.controller")
@ControllerAdvice(basePackages = {
"cn.myz.demo.controller"})
public class GlobalExceptionHandler {
}
basePackages
:指定一个或多个包,这些包及其子包下的所有 Controller 都被该 @ControllerAdvice 管理。其中上面两种等价于 basePackages。
basePackageClasses
@ControllerAdvice(basePackageClasses = {
MyController1.class})
public class GlobalExceptionHandler {
}
basePackageClasses
:是 basePackages 的一种变形,指定一个或多个 Controller 类,这些类所属的包及其子包下的所有 Controller 都被该 @ControllerAdvice 管理。
assignableTypes
@ControllerAdvice(assignable