项目有多个子模块
模块1:security共通模块
模块2:exception共通模块
模块1:
@Slf4j
@Order(1)
@ResponseBody
@ControllerAdvice
public class RSecurityDispose {
/**
* 额外处理一下 AccessDeniedException 无权限异常
* @param request request
* @param e e
* @return R<String>
*/
@ExceptionHandler(AccessDeniedException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public R<String> handleAccessDeniedException(HttpServletRequest request, AccessDeniedException e){
return R.error(ExceptionCodeEnum.NO_PERMISSIONS);
}
}
模块2
@Slf4j
@ResponseBody
@ControllerAdvice
@Order(10)//加入Order 多异常处理优先处理顺序 https://blog.csdn.net/gaoshan12345678910/article/details/106361438
public class ExceptionDispose {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public R<String> handleException(HttpServletRequest request, Exception e){
return this.error(request,e,ExceptionCodeEnum.FIVE_ZERO_ZERO);//系统异常
}
}
1.两个模块同时存在 @ControllerAdvice 时候,可以按照 @Order 进行排序
2.@Order的值越小说明先进行拦截判断
3.比如 AccessDeniedException 是 Exception 的子类 所以Order的值必须小才行
看源码查看多个@ControllerAdvice的顺序
- ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerMethod handlerMethod, Exception exception)
- getExceptionHandlerMethod()
- this.exceptionHandlerAdviceCache
可以发现有两个异常处理器类