Валидация

Тема дорожной карты · Spring Boot

Bean Validation в Spring Boot — это интеграция спецификации Jakarta Bean Validation (JSR-380), реализованной Hibernate Validator, позволяющая декларативно проверять ограничения на полезных нагрузках запросов, доменных объектах и параметрах методов по всему приложению. Добавление spring-boot-starter-validation помещает Hibernate Validator в classpath и позволяет Spring Boot авто-настроить бин Validator; аннотирование параметра метода @RestController через @Valid или @Validated затем запускает проверку ограничений до выполнения тела метода, причём MethodArgumentNotValidException автоматически преобразуется в HTTP-ответ 400. Стандартные ограничения — @NotNull, @NotBlank, @Size(min=2, max=50), @Email, @Min, @Max, @Pattern и @Future — покрывают большинство сценариев валидации ввода, тогда как @Constraint позволяет разработчикам создавать пользовательские валидаторы, реализующие ConstraintValidator<A, T> для доменно-специфических правил, например проверки уникальности имени пользователя через Spring Data. Bean Validation в Spring Boot также применяется на уровне сервиса, когда @Validated размещается на классе @Service, обеспечивая валидацию аргументов и возвращаемых значений методов на каждой архитектурной границе, а не только в точках входа HTTP. Ошибки валидации обогащаются локализованными сообщениями через messages.properties, а полные метаданные ограничений доступны в обработчиках исключений @ControllerAdvice для построения структурированных ответов об ошибках, потребляемых фронтенд-клиентами или движками правил API-шлюзов.

Как это работает

Валидация: Spring MVC + REST. @RestController возвращает JSON (или что HttpMessageConverter выберет); @RequestMapping (или method-specific @GetMapping/@PostMapping) маппит URL → handler. @PathVariable для /users/{id}, @RequestParam для query string, @RequestBody для десериализации body. @Valid + Bean Validation (Jakarta Validation) проверяет input. @ControllerAdvice + @ExceptionHandler централизуют error → HTTP-response маппинг. Servlet-стек на Tomcat дефолт; переключайтесь на Jetty/Undertow через starter exclusions.

Когда применять

DTO на границе controller — никогда не экспортируйте JPA-сущности напрямую (утечка внутренней модели + lazy-loading issues). Централизуйте error handling в @ControllerAdvice — дублированный try/catch = технический долг. Валидация рано. OpenAPI (springdoc-openapi) для документации + генерации клиентов. Для high-throughput non-blocking — WebFlux, но только при реальной нужде.

Типичные ошибки

Ловушки Валидация: возврат JPA-сущностей (lazy-loading бьёт DB после закрытия транзакции → LazyInitializationException); нет валидации input (мусор лезет в service-слой); не используют @ControllerAdvice (error handling разбросан, неконсистентные ответы); игнор HTTP-семантики (200 на ошибках).

Связанные понятия

Полезные ресурсы