我想处理验证器抛出的异常。
我已经用ControllerAdvice注释制作了异常处理程序。它处理其他异常,但不处理MethodArgumentNotValidException。
异常处理程序
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value
= {ResourceNotFoundException.class, EntityNotFoundException.class})
protected ResponseEntity<Object> handleNotFound(
RuntimeException ex, WebRequest request) {
APIException apiException = new APIException(HttpStatus.NOT_FOUND,
ex.getMessage(), request);
return handleExceptionInternal(ex, apiException,
new HttpHeaders(), apiException.getStatus(), request);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid
(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
APIException apiException = new APIException(HttpStatus.BAD_REQUEST,
ex.getMessage(), request);
return handleExceptionInternal(ex, apiException,
new HttpHeaders(), apiException.getStatus(), request);
}
}
经过验证的类(没有getter / setter等)
public class ClassQuery {
@Min(1)
private Integer minYear;
@Min(1)
private Integer year;
@Min(1)
private Integer maxYear;
private String name;
private String profile;
}
Rest API控制器
@GetMapping
public Page<Class> getClasses(@Valid ClassQuery classQuery, Pageable pageable) {
return classService.getClasses(classQuery, pageable);
}
Api异常(没有getter / setter等)
public class APIException {
private Date timestamp;
private HttpStatus status;
private String message;
private String path;
public APIExceptionMessage(HttpStatus status, String message, WebRequest request) {
this();
this.status = status;
this.message = message;
this.path = getRequestURI(request);
}
}
当前,我从验证器收到BAD_REQUEST http状态为空的响应,而其他异常得到了正确处理。我也尝试过不扩展ResponseEntityExceptionHandler并使用@ExceptionHandler处理它,但是它忽略了我的响应主体,作为响应,它给出了默认错误消息。我没有任何错误。
答案 0 :(得分:1)
这可能为时已晚。
我遇到了同样的问题,即MethodArgumentNotValidException
并没有被标注为ControllerAdvice
的类处理。就我而言,我想序列化自定义ErrorDTO对象并将其作为JSON发送到HTTP客户端。
解决方案:
MethodArgumentNotValidException
应该从 org.springframework.web.bind.MethodArgumentNotValidException
导入。