Вопрос с собеседования · Spring

Как в Spring MVC обычно обрабатывают ошибки и валидацию входных DTO?

MiddleВалидация и обработка ошибокSpring
Ещё спрашивают так:
  • Как валидировать входные данные 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?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования