Зачем нужна аннотация @Valid на теле запроса в контроллере?
- Как проверить поля запроса в Spring?
@Valid на теле запроса включает проверку ограничений на полях DTO (@NotBlank, @Email, @Size); при нарушении метод контроллера не вызывается, клиент получает 400.
- Нужен spring-boot-starter-validation
- Без @Valid аннотации на полях не проверяются
- Ошибки удобно отдавать списком полей через @RestControllerAdvice
А ещё Вложенные объекты — @Valid и на поле
Подробно
Сами правила задаются аннотациями на полях объекта — @NotNull, @Size, @Email и подобными, — а @Valid просит фреймворк их применить. Без неё аннотации на полях просто ничего не делают, что является частой причиной «валидация не работает». При нарушении бросается исключение, которое по умолчанию превращается в ответ 400. Преобразованием JSON в объект занимается отдельный механизм конвертеров, к валидации отношения не имеющий.
Что хотят услышать
- Что делает @Valid и что происходит при ошибке.
Частые ошибки
- Разместить ограничения на полях и забыть @Valid в контроллере.
- Забыть @Valid на вложенном поле и оставить внутренний объект непроверенным.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Чтобы преобразовать JSON из тела запроса в объект DTO и обратно
- ✗Чтобы открыть транзакцию на время обработки запроса контроллером
- ✗Чтобы залогировать содержимое запроса вместе с заголовками и параметрами
- ✓Чтобы проверить ограничения на полях DTO до входа в метод
Что спросят дальше
- Какое исключение возникает при неудачной валидации тела запроса?
- Чем @Validated отличается от @Valid?
Разбор темы
- Валидация и обработка ошибок
Bean Validation и @Valid/@Validated, превращение ошибок в ответ, @ControllerAdvice и единый контракт, ProblemDetail (RFC 7807), multipart и interceptors.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.