Spring @ControllerAdvice 使用及源码分析

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。
————————————————
版权声明:本文为CSDN博主「努力的小星星」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/GAOXINXINGgaoxinxing/article/details/91416412

发布了66 篇原创文章 · 获赞 222 · 访问量 119万+

猜你喜欢

转载自blog.csdn.net/Liuqz2009/article/details/104474714