默认情况下@ControllerAdvice注解只能通过AOP处理Controller层异常,无法处理Filter异常
但是FIlter异常默认会指向/error处理,也就是通过ErrorController处理,一般情况下会这样
但是我们又想通过@ControllerAdvice全局处理怎么办呢?
这里提出一种解决方案,肯定不是最优雅的,各位可以友好讨论一下
废话不多说,直接上图
第一步:通过@ControllerAdvice定义我们的全局处理类
/**
* 全局异常处理
*
* @author PanYunzhen
* @version 1.0.0
* @since 2022-09-07
*/
@RestControllerAdvice
@AllArgsConstructor
@Slf4j
public class GlobalExceptionHandler implements ExceptionResolver {
/**
* 处理 SpringMVC 请求参数缺失
* <p>
* 例如说,接口上设置了 @RequestParam("xx") 参数,结果并未传递 xx 参数
*/
@ExceptionHandler(value = MissingServletRequestParameterException.class)
public RestResult missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException ex) {
log.warn("[missingServletRequestParameterExceptionHandler]", ex);
return RestResult.error(WebErrorCode.BAD_REQUEST, ex.getParameterName());
}
/**
* 处理 SpringMVC 请求参数类型错误
* <p>
* 例如说,接口上设置了 @RequestParam("xx") 参数为 Integer,结果传递 xx 参数类型为 String
*/
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public RestResult methodArgumentTypeMismatchExceptionHandler(MethodArgumentTypeMismatchException ex) {
log.warn("[missingServletRequestParameterExceptionHandler]", ex);
return RestResult.error(WebErrorCode.BAD_REQUEST, ex.getMessage());
}
/**
* 处理 SpringMVC 参数校验不正确
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public RestResult methodArgumentNotValidExceptionExceptionHandler(MethodArgumentNotValidException ex) {
log.warn("[methodArgumentNotValidExceptionExceptionHandler]", ex);
FieldError fieldError = ex.getBindingResult().getFieldError();
assert fieldError != null;
return RestResult.error(WebErrorCode.BAD_REQUEST, fieldError.getDefaultMessage());
}
/**
* 处理 SpringMVC 请求地址不存在
* <p>
* 注意,它需要设置如下两个配置项:
* 1. spring.mvc.throw-exception-if-no-handler-found 为 true