1.背景
项目中使用 javax.validation.Valid 添加接口参数校验,在 VObean中添加 @NotBlank ,
当VObean中校验通过时,都为正常;
当VObean中 @NotBlank 校验不通过时,接口(状态400)没有返回信息;
于是我在原来的全局异常处理添加了一个处理 如下:
1 @RestControllerAdvice 2 public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { 3 4 @ExceptionHandler(MethodArgumentNotValidException.class) 5 public Result handleValidException(MethodArgumentNotValidException e){ 6 //日志记录错误信息 7 log.error(Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); 8 //将错误信息返回给前台 9 return Result.error(103, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()); 10 } 11 12 }
启动项目报错:java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.web.bind.MethodArgumentNotValidException]
简单理解:异常堆栈标明,重复定义了异常拦截。
但是我这里只有这个拦截为什么重复呢?
然后发现 这个异常拦截继承ResponseEntityExceptionHandler 这个类里集成很多异常拦截,其中就包括MethodArgumentNotValidException
拦截到这个异常之后的处理:把状态修改为400,就返回了,所以导致 我们想要的校验错误信息没有返回
2.解决方案
1.保留自己定义的异常拦截器,不再继承 ResponseEntityExceptionHandler
2.删除自己定义的异常拦截器,重写 ResponseEntityExceptionHandler.handleMethodArgumentNotValid方法
1 protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { 2 //日志记录错误信息 3 logger.error(Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage()); 4 //将错误信息返回给前台 5 return new ResponseEntity(Objects.requireNonNull(ex.getBindingResult().getFieldError()).getDefaultMessage(), headers, status); 6 }