Как в Spring MVC обычно обрабатывают ошибки и валидацию входных DTO?
- Как валидировать входные данные REST API в Spring?
Ограничения — аннотациями Bean Validation на полях DTO (@NotBlank, @Email, @Size, @Positive), проверка — **@Valid на параметре контроллера, ошибки — в @RestControllerAdvice** в едином формате (ProblemDetail с полями).
- Нужна зависимость spring-boot-starter-validation (Hibernate Validator)
- Невалидное тело → MethodArgumentNotValidException → 400
- Вложенные объекты — @Valid на поле; списки —
List<@Valid Item>
А ещё Бизнес-правила (уникальность email) — в сервисе, а не аннотацией
Подробно
Объявление правил:
public record CreateUserRequest(
@NotBlank @Size(max = 80) String name,
@NotBlank @Email String email,
@Valid @NotNull AddressDto address,
@Size(max = 10) List<@NotBlank String> tags) {}
Проверка: @PostMapping ... create(@Valid @RequestBody CreateUserRequest req). При нарушении Spring бросает MethodArgumentNotValidException (для @RequestBody) или HandlerMethodValidationException (Spring 6.1+, для параметров метода); по умолчанию — 400.
Единый ответ: в @RestControllerAdvice превращать MethodArgumentNotValidException в ProblemDetail со списком ошибок полей (field, message), чтобы клиент мог подсветить их в форме.
Группы и параметры: @Validated(OnCreate.class) — разные правила для создания и изменения; @Validated на классе сервиса — проверка параметров методов (@NotNull, @Min на аргументах).
Где граница: аннотации — для формата и обязательности. Правила, требующие данных (email уже занят, товар закончился), — в сервисе с понятным исключением (409, 422). Свои ограничения — аннотация + ConstraintValidator.
Что хотят услышать
- Аннотации на DTO и @Valid.
- Исключение и обработка в едином формате.
- Вложенные объекты, группы.
- Граница между валидацией формата и бизнес-правилами.
Частые ошибки
- Забыть стартер validation — аннотации молча не работают.
- Проверять уникальность аннотацией с запросом в базу.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ловить исключения в каждом методе вручную и возвращать 200 OK с текстом ошибки в теле
- ✓@Valid даёт 400, а единый @RestControllerAdvice формирует ProblemDetail
- ✗Валидацию писать в SQL-триггерах
- ✗Возвращать 500 со стеком исключения
Что спросят дальше
- Чем @Valid отличается от @Validated?
- Как вернуть field errors?
Разбор темы
- Валидация и обработка ошибок
Bean Validation и @Valid/@Validated, превращение ошибок в ответ, @ControllerAdvice и единый контракт, ProblemDetail (RFC 7807), multipart и interceptors.
Связанные вопросы
- Чем @Validated отличается от @Valid? Middle
- В контроллере стоит @Valid @RequestBody CreateUserRequest, и клиент прислал невалидное тело. Что произойдёт по умолчанию? Middle
- Зачем нужна аннотация @Valid на теле запроса в контроллере? Junior
- Как в Spring Boot 3 возвращать ошибки REST API в едином формате? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.