Валидация данных в Java: обзор инструментов и библиотек
Валидация (проверка корректности) данных — один из ключевых этапов разработки любого приложения. Без надёжной проверки входных данных приложение становится уязвимым для ошибок, некорректного поведения и атак. В Java существует несколько проверенных подходов и библиотек, которые позволяют реализовать валидацию быстро, гибко и с минимальным количеством шаблонного кода.
В этой статье мы рассмотрим основные инструменты для валидации данных в Java: стандарт Bean Validation (Jakarta Validation), его самую популярную реализацию Hibernate Validator, а также альтернативу — Apache Commons Validator. Отдельно затронем ручную валидацию для простых случаев.
1. Стандарт Bean Validation (Jakarta Validation)
Bean Validation (ранее JSR 380, ныне Jakarta Validation) — это спецификация, определяющая набор аннотаций для декларативной валидации Java-объектов. Основная идея: вы описываете правила проверки прямо в полях класса с помощью аннотаций, а движок валидации автоматически проверяет их.
Основные аннотации
@NotNull— значение не должно быть null.@NotEmpty— строка, коллекция или массив не должны быть пустыми (и не null).@NotBlank— строка не должна быть пустой или состоять только из пробелов.@Size(min, max)— ограничение длины строки, размера коллекции или массива.@Min/@Max— числовые ограничения.@Pattern(regexp = "...")— проверка по регулярному выражению.@Email— проверка формата email-адреса.
Пример использования
import jakarta.validation.constraints.*;
public class User {
@NotBlank(message = "Имя не может быть пустым")
@Size(min = 2, max = 50)
private String name;
@Email(message = "Некорректный email")
@NotNull
private String email;
@Min(18)
@Max(120)
private int age;
// геттеры и сеттеры
}
Для запуска валидации используется объект Validator:
import jakarta.validation.*;
import java.util.Set;
public class ValidationExample {
public static void main(String[] args) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
User user = new User();
user.setName("A");
user.setEmail("invalid-email");
user.setAge(10);
Set<ConstraintViolation<User>> violations = validator.validate(user);
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
2. Hibernate Validator — реализация стандарта
Hibernate Validator — эталонная реализация спецификации Bean Validation. Она полностью поддерживает все аннотации Jakarta Validation и добавляет собственные расширения, такие как @URL, @CreditCardNumber, @ISBN и другие.
Дополнительные возможности
- Кастомные валидаторы — можно создавать свои аннотации и логику проверки.
- Группы валидации — проверять разные наборы правил в зависимости от контекста (например, создание vs обновление).
- Интеграция с Spring Boot, Java EE / Jakarta EE из коробки.
Пример кастомного валидатора
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface ValidPhone {
String message() default "Некорректный номер телефона";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) return false;
return value.matches("\\+?[0-9]{10,15}");
}
}
Теперь можно использовать @ValidPhone в любом поле:
public class Contact {
@ValidPhone
private String phone;
}
3. Apache Commons Validator
Apache Commons Validator — библиотека от Apache, предоставляющая набор готовых валидаторов для распространённых случаев: email, URL, IP-адрес, номер кредитной карты, дата и другие. В отличие от Bean Validation, здесь валидация выполняется программно, без аннотаций.
Пример использования
import org.apache