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

Ссылка скопирована
1 ответ

В общем ситуаций такая, есть dto, например такое:

data class UserDto(     @field:NotBlank     val name: String,      @field:NotBlank     @field:Email     val email: String,      @field:NotBlank     val password: String,      val active: Boolean, )

data class UserDto( @field:NotBlank val name: String, @field:NotBlank @field:Email val email: String, @field:NotBlank val password: String, val active: Boolean, )

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

{     "name": "Вася" }

{ "name": "Вася" }

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

Можно ли как-то валидировать этот кейс?

Дополнительно:

Ответы:

Добрый день.

Для валидации в спринг бут используется фреймворк - 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);     }

@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); }

  • Подобный код уже есть, но описанный в вопросе кейс он не обрабатывает.
  • galliard, ну насчет котлина не подскажу.
    А смотрели это решение?
    https://stackoverflow.com/questions/69811803/in-ko...
    У вас зависимость добавлена наверное?
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Для валидации отсутствующих полей в запросе в Spring можно использовать аннотацию @Validated в сочетании с классом BindingResult.

Начнем с создания класса модели, который представляет данные, полученные из запроса. Для каждого поля, которое должно быть обязательным, добавим соответствующую аннотацию @NotNull. Например:

public class User {
    @NotNull
    private String username;
 
    @NotNull
    private String email;
 
    // геттеры и сеттеры
}

public class User { @NotNull private String username; @NotNull private String email; // геттеры и сеттеры }

Затем создадим контроллер, который будет обрабатывать запросы. В методе контроллера, который принимает данные от пользователя, добавим параметры @Validated и BindingResult для валидации и получения результатов валидации. Например:

@RestController
public class UserController {
 
    @PostMapping("/users")
    public ResponseEntity createUser(@Validated @RequestBody User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // Обработка ошибок валидации
            return ResponseEntity.badRequest().body("Ошибка валидации");
        }
 
        // Логика создания пользователя
        return ResponseEntity.ok("Пользователь создан успешно");
    }
}

@RestController public class UserController { @PostMapping("/users") public ResponseEntity createUser(@Validated @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { // Обработка ошибок валидации return ResponseEntity.badRequest().body("Ошибка валидации"); } // Логика создания пользователя return ResponseEntity.ok("Пользователь создан успешно"); } }

Теперь, если в запросе от пользователя отсутствует обязательное поле (например, username или email), то валидация будет провалена и вернется сообщение об ошибке.

Таким образом, используя аннотацию @Validated и класс BindingResult, можно легко валидировать отсутствующие поля в запросе в Spring.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно