Валидация данных в Java: обзор инструментов и библиотек

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в 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                    

Рекомендаций