如何处理MethodArgumentNotValidException

时间:2019-07-19 15:40:19

标签: java spring spring-boot validation spring-mvc

我想处理验证器抛出的异常。

我已经用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处理它,但是它忽略了我的响应主体,作为响应,它给出了默认错误消息。我没有任何错误。

1 个答案:

答案 0 :(得分:1)

这可能为时已晚。

我遇到了同样的问题,即MethodArgumentNotValidException并没有被标注为ControllerAdvice的类处理。就我而言,我想序列化自定义ErrorDTO对象并将其作为JSON发送到HTTP客户端。

解决方案: MethodArgumentNotValidException应该 org.springframework.web.bind.MethodArgumentNotValidException导入。