Весенняя загрузка: переопределенный дескрипторMethodArgumentNotValid не выполнен

Я проверяю параметры запроса для конечной точки отдыха как:

@Valid BoundingBox boundingBox

Список параметров запроса сопоставляется с экземпляром BoundingBox. В классе BoundingBox я использовал аннотации для проверки полей, такие как @Max, @Min и т. д.

Чтобы обработать любой недопустимый параметр запроса, я переопределил метод ResponseEntityExceptionHandler.handleMethodArgumentNotValid следующим образом:

@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers, HttpStatus status,
                                                                  WebRequest request) {
        List<String> details = new ArrayList<>();
        for(ObjectError error : ex.getBindingResult().getAllErrors()) {
            details.add(error.getDefaultMessage());
        }
        ExceptionDetails error = new ExceptionDetails("Validation Failed", details);
        return new ResponseEntity(error, HttpStatus.BAD_REQUEST);
    } 

Аннотация ControllerAdvice размещается в верхней части класса обработчика. @Valid, кажется, работает, поскольку запрос не проходит и возвращает BAD_REQUEST, но метод handleMethodArgumentNotValid не вызывается.


person Mandroid    schedule 06.06.2020    source источник


Ответы (1)


Этот ответ основан на предположении, что тело запроса не указано.

В этом случае метод handleMethodArgumentNotValid вызываться не будет, вместо этого будет вызван метод handleHttpMessageNotReadable в классе ResponseEntityExceptionHandler, который вернет тело значения null.

protected ResponseEntity<Object> handleHttpMessageNotReadable(
        HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus 
        status, WebRequest request) {

    return handleExceptionInternal(ex, null, headers, status, request);
}

Вы можете указать собственное поведение, используя приведенный ниже пример кода.

@ControllerAdvice
public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @Override
    protected ResponseEntity<Object> 
          handleHttpMessageNotReadable(HttpMessageNotReadableException ex, 
          HttpHeaders headers, HttpStatus status, WebRequest request) {
        Map<String, Object> response = new HashMap<>();
        response.put("message", "Required request body is missing");

        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
    }
}

Приведенное выше вернет объект ниже с кодом состояния 400.

{ "message": "Required request body is missing" }
person Eziokwubundu Chibueze    schedule 17.08.2020