@galliard

Как в spting валидировать отсутствующие в запросе поля?

В общем ситуаций такая, есть dto, например такое:
data class UserDto(
    @field:NotBlank
    val name: String,

    @field:NotBlank
    @field:Email
    val email: String,

    @field:NotBlank
    val password: String,

    val active: Boolean,
)


И я кидаю в него невалидный джейсончик типа такого:
{
    "name": "Вася"
}


То есть часть обязательных полей, описанных в дто, в джейсоне отсутствуют. Я хотел бы обрабатывать и валидировать этот кейс и выдавать пользователю понятное сообщение об ошибке. Однако на него я ловлю только org.springframework.http.converter.HttpMessageNotReadableException, в котором нет никакой информации о том, какие именно поля отсутствуют в запросе.

Можно ли как-то валидировать этот кейс?
  • Вопрос задан
  • 34 просмотра
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Добрый день.

Для валидации в спринг бут используется фреймворк - spring-boot-starter-validation
Используйте его и добавьте необходимые зависимости - NotNull, NotBlank, NotEmpty и т.д.
Далее на уровне метода контроллера, где в аргументе вы принимаете dto добавьте аннотацию @Valid или @Validated (это разные аннотации.)

Полезные ссылки
https://www.baeldung.com/spring-valid-vs-validated
https://stackoverflow.com/questions/3595160/what-d...

Ошибку будете получать - `MethodArgumentNotValidException`
Вот, даже метод для обработки исключения в @RestControllerAdvice
@ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorMessage> handleValidationExceptions(
            MethodArgumentNotValidException ex,
            WebRequest request
    ) {
        var errorMessage = ErrorMessage.builder()
                .status(HttpStatus.UNPROCESSABLE_ENTITY.value())
                .message("Validating problem")
                .stackTrace(isTraceOn(request) ? getStackTrace(ex) : null)
                .build();
        if (CollectionUtils.isNotEmpty(ex.getBindingResult().getAllErrors())) {
            ex.getBindingResult().getAllErrors().forEach(
                    error -> {
                        String fieldName = error.getObjectName();
                        String errorText = error.getDefaultMessage();
                        errorMessage.addValidationError(fieldName, errorText);
                    });
        }

        return ResponseEntity.unprocessableEntity().body(errorMessage);
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы