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

Spring @ControllerAdvice 使用及源码分析_第1张图片

2、 进入processDispatchResult方法,调用processHandlerException

Spring @ControllerAdvice 使用及源码分析_第2张图片

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

Spring @ControllerAdvice 使用及源码分析_第3张图片

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

Spring @ControllerAdvice 使用及源码分析_第4张图片

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

Spring @ControllerAdvice 使用及源码分析_第5张图片

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

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

你可能感兴趣的:(Spring,java,web)