全局异常处理

 

目录

一、RestControllerAdvice

二、实例

三、spring处理

3.1  bean初始化流程

3.2 全局处理流程


一、RestControllerAdvice

@RestControllerAdvice、@ControllerAdvice 注解
可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute
并应用到所有@RequestMapping  

  ControllerAdvice需要增加 @ResponseBody

  RestControllerAdvice不需要加 @ResponseBody

二、实例

@RestControllerAdvice
public class GlobalExceptionHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = BusinessException.class)
    public ResponseEntity handlerBusinessException(BusinessException ex){
        return new ResponseEntity(ex.getCodeEnum());
    }

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity handlerException(Exception ex){
        LOGGER.error("发生全局异常", ex);
        return ResponseEntity.ofSystemBusy();
    }
}

三、spring处理

3.1  bean初始化流程

WebMvcConfigurationSupport.handlerExceptionResolver->

WebMvcAutoConfiguration.configureHandlerExceptionResolvers ->  

WebMvcConfigurationSupport.addDefaultHandlerExceptionResolvers -> 

ExceptionHandlerExceptionResolver.afterPropertiesSet ->

ExceptionHandlerExceptionResolver.initExceptionHandlerAdviceCache

ExceptionHandlerExceptionResolver这个类里存储了所有ControllerAdvice注解的处理器

初始化HandlerExceptionResolver

简言之,一共两件事

1、初始化HandlerExceptionResolverComposite,这个存储着HandlerExceptionResolver处理器列表

2、初始化ExceptionHandlerExceptionResolver的缓存,存储着所有ControllerAdvice主键的处理器

 

3.2 全局处理流程

进入doService方法,开始业务处理,当遇到异常时在processDispatchResult方法里进行处理,接着对于非ModelAndViewDefiningException的异常,在processHandlerException中处理,在这个方法中会调用HandlerExceptionResolverComposite(这个在前面我们已经知道,项目启动的时候已经初始化了所有的HandlerExceptionResolver,其中包含了ExceptionHandlerExceptionResolver,而ExceptionHandlerExceptionResolver又包含了自定义的ControllerAdvice主键类)的resolveException方法进行处理

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值