Spring @ControllerAdvice 使用及源码分析

深入解析Spring框架中@ControllerAdvice注解的使用,了解如何全局捕获并处理Controller中的异常,掌握ExceptionHandlerExceptionResolver的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ControllerAdvice作为Spring中默认的注解,提供对所有(你的项目包扫描范围内)Controller的异常捕获功能。

使用时,如下:

@Order(Integer.MAX_VALUE)
@ControllerAdvice
public class DefaultExceptionHandler {
    protected Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);


    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity defaultErrorHandler(Exception e) {
        ...
        return xxx;
    }

}

首先,@ControllerAdvice是作用于类上注解,故先配置到类上,声明为adviceBean;

然后,编写handler,@ExceptionHandler注解用于adviceBean中标识method,表示该method所切异常归属,如上中Exception.class;@ResponseBody注解用于将此方法返回类型表明为json格式,该注解可选,若method返回值为具体类,则不需此注解。

最后,method方法体进行异常捕获后处理,构造结果。

以上写法是通用写法,具体需根据实际需要进行编写,接下来将介绍spring中是如何处理异常的,便于我们加深理解,并灵活运用。

开发web过程中,相信我们都知道一个类:DispatcherServlet,那么以它为入口,开始我们的异常捕获之旅。

1、进入doDispatch方法,该方法也是DispatcherServlet的主要方法,主要处理过程均在此,别的不说,处理完结果之后,进入processDispatchResult

2、 进入processDispatchResult方法,调用processHandlerException

3、进入processHandlerException方法,开始轮询handlerExceptionResolvers,进行异常处理

在这些resolver中,有一个resolver专门捕获异常使用,那就是ExceptionHandlerExceptionResolver, 最终,通过上面第三步中的resolverException方法,进入到ExceptionHandlerExceptionResolver的doResolverHandlerMethodException处理方法

 首先,getExceptionHandlerMethod去获取异常处理方法

该方法中,会拿到定义的所有的ControllerAdvice,根据Order(上面例子中的Order,序号越小,越优先处理)去获取匹配的异常处理方法 ,拿到之后,基于反射进行我们定义方法的调用,并拿到结果进行最终结果的返回。

注意:此步中,排名靠前的advice类,找到匹配的异常处理method后,将不再继续执行查找过程,直接返回靠前的method。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值