Spring之ControllerAdvice
@ControllerAdvice
初始化
RequestMappingHandlerAdapter.initControllerAdviceCache
从ControllerAdviceBean.findAnnotatedBeans获取所有ControllerAdviceBean,排序取决于Order
对于每个bean:
- 获取
ModelAttribute、InitBinder相关注解函数 - 如果bean实现了
RequestBodyAdvice、ResponseBodyAdvice接口,则记录
注解支持作用范围
- 包
- 具体Controller class
- 带有指定注解的Controller
RequestBodyAdvice原理
AbstractMessageConverterMethodArgumentResolver#readWithMessageConverters
- 先遍历寻找
HttpMessageConverter - 链式执行
beforeBodyRead(所有满足条件的RequestBodyAdvice,顺序取决于Order) HttpMessageConverter解析body- 链式执行
afterBodyRead
1 | message = new EmptyBodyCheckingHttpInputMessage(inputMessage); |
ResponseBodyAdvice原理
和
RequestBodyAdvice类似
- 先遍历寻找
HttpMessageConverter - 链式执行
beforeBodyWrite - 执行
converter.write
@ExceptionHandler原理
初始化
ExceptionHandlerExceptionResolver.initExceptionHandlerAdviceCache
从ControllerAdviceBean.findAnnotatedBeans获取所有ControllerAdviceBean
对于每个bean:
- 解析
@ExceptionHandler注解
获取对应的异常处理器
ExceptionHandlerExceptionResolver.getExceptionHandlerMethod
- 遍历
ControllerAdvice,返回第一个可处理该异常的Handler