Найти в Дзене
Записки о Java

Валидация данных в контроллерах JAVA

Валидация входящих данных — один из ключевых аспектов построения надёжных и безопасных REST API в Spring Boot. В этой статье мы подробно разберём, как правильно валидировать данные в контроллерах, используя стандарт Bean Validation (JSR-380) и возможности Spring Framework. Все примеры написаны для Java 11, что соответствует многим enterprise-проектам. Представьте: ваш API принимает заказ на товар, но клиент передал отрицательную цену или пустое имя. Без валидации такая «сущность» попадёт в базу данных, ломая логику приложения и потенциально вызывая финансовые или юридические последствия. Правило №1: Никогда не доверяйте входным данным. Всегда проверяйте то, что приходит извне. Для работы с валидацией в Spring Boot вам понадобятся: <!-- В pom.xml --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot автоматически подтягивает Hibernate Validator (реализация Bean Validation) --> <dependency> <groupId>
Оглавление

Введение

Валидация входящих данных — один из ключевых аспектов построения надёжных и безопасных REST API в Spring Boot. В этой статье мы подробно разберём, как правильно валидировать данные в контроллерах, используя стандарт Bean Validation (JSR-380) и возможности Spring Framework. Все примеры написаны для Java 11, что соответствует многим enterprise-проектам.

Почему валидация так важна?

Представьте: ваш API принимает заказ на товар, но клиент передал отрицательную цену или пустое имя. Без валидации такая «сущность» попадёт в базу данных, ломая логику приложения и потенциально вызывая финансовые или юридические последствия.

Правило №1: Никогда не доверяйте входным данным. Всегда проверяйте то, что приходит извне.

Требуемые зависимости

Для работы с валидацией в Spring Boot вам понадобятся:

<!-- В pom.xml -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!-- Spring Boot автоматически подтягивает Hibernate Validator (реализация Bean Validation) -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-validation</artifactId>

</dependency>

Начиная с Spring Boot 2.3+, spring-boot-starter-validation — это отдельная зависимость. Убедитесь, что она подключена!

Простой пример: валидация DTO в POST-запросе

Допустим, у нас есть контроллер для регистрации пользователя:

1. Создаём DTO с аннотациями валидации

Рисунок: простой DTO с аннотациями валидации
Рисунок: простой DTO с аннотациями валидации

2. Контроллер с валидацией

Рисунок: контролллер с валидацией
Рисунок: контролллер с валидацией

Ключевой момент — аннотация @Valid перед аргументом. Именно она активирует валидацию.

Обработка ошибок валидации

Без обработки ошибок клиент получит 500 Internal Server Error или нечитаемый JSON. Это плохой UX.

Нам нужен глобальный обработчик исключений.

Создаём GlobalExceptionHandler

Рисунок: глобальный обработчик исключений контроллера
Рисунок: глобальный обработчик исключений контроллера

Теперь при невалидном запросе клиент получит:

{

"email": "Некорректный формат email",

"password": "Пароль должен содержать минимум 8 символов"

}

Тестирование валидации (JUnit 5 + MockMvc)

Важно покрыть валидацию тестами:

Рисунок: тест, проверяющий валидность данных
Рисунок: тест, проверяющий валидность данных

Валидация в GET-запросах (параметры URL)

Для параметров запроса (@RequestParam) валидация работает иначе:

Рисунок: пример валидации в GET-запросах
Рисунок: пример валидации в GET-запросах

Резюме

  • Всегда валидируйте входные данные в контроллерах.
  • Используйте @Valid для @RequestBody.
  • Используйте @Validated на классе для валидации параметров (@RequestParam, @PathVariable).
  • Обрабатывайте ошибки через @RestControllerAdvice.
  • Покрывайте валидацию тестами.
  • Для сложной логики — пишите кастомные валидаторы.
Помните: валидация — это не только про корректность данных, но и про защиту вашего приложения, повышение UX и сохранение целостности данных.

Заключение

Пример, рассмотренный в статье, можно найти по адресу:

https://github.com/ShkrylAndrei/blog_yandex/tree/main/src/main/java/info/shkryl/validation_data_in_controller