Как в 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, ) |
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...
У вас зависимость добавлена наверное?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для валидации отсутствующих полей в запросе в Spring можно использовать аннотацию @Validated в сочетании с классом BindingResult.
Начнем с создания класса модели, который представляет данные, полученные из запроса. Для каждого поля, которое должно быть обязательным, добавим соответствующую аннотацию @NotNull. Например:
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("Пользователь создан успешно"); } }
Теперь, если в запросе от пользователя отсутствует обязательное поле (например, username или email), то валидация будет провалена и вернется сообщение об ошибке.
Таким образом, используя аннотацию @Validated и класс BindingResult, можно легко валидировать отсутствующие поля в запросе в Spring.