Spring Boot 4 Microservices & REST APIs · Урок

Пользовательские валидаторы

Создавайте собственные ограничения проверки

Урок 2 из 413 шагов

«Пользовательские валидаторы» — бесплатный урок Spring Boot 4 Microservices & REST APIs на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Spring Boot 4 Microservices & REST APIs, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Spring Boot 4 Microservices & REST APIs содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

When Built-ins Are Not Enough

Standard constraints cannot express every rule — a valid coupon code format, a phone number for a region, or a value that must exist in the database. For these you write a custom constraint backed by a validator.

Two Parts of a Custom Constraint

A custom constraint has two pieces:

  • An annotation that you place on fields or parameters
  • A ConstraintValidator that contains the actual checking logic

Defining the Annotation

Create the annotation and link it to its validator with @Constraint. Declare the standard message, groups, and payload members required by the spec.

@Target({ FIELD, PARAMETER })
@Retention(RUNTIME)
@Constraint(validatedBy = StrongPasswordValidator.class)
public @interface StrongPassword {
    String message() default "Password is not strong enough";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Implementing ConstraintValidator

The validator implements ConstraintValidator<Annotation, Type> and overrides isValid. Return true when the value satisfies the rule.

public class StrongPasswordValidator
        implements ConstraintValidator<StrongPassword, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext ctx) {
        if (value == null) return true; // let @NotNull handle null
        return value.length() >= 8
            && value.chars().anyMatch(Character::isDigit)
            && value.chars().anyMatch(Character::isUpperCase);
    }
}

Null-Handling Convention

By convention a custom validator treats null as valid, delegating null-checking to @NotNull. This keeps constraints composable — each rule does one job.

Using the Custom Constraint

Apply your annotation just like a built-in one. Combined with @Valid on the controller, it participates in the normal validation flow.

public class CreateUserRequest {
    @NotBlank
    @StrongPassword
    private String password;
}

Custom Violation Messages

Inside isValid you can disable the default message and add a contextual one, useful when a single annotation enforces several sub-rules.

ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(
        "Password must include a digit and an uppercase letter")
   .addConstraintViolation();
return false;

Injecting Beans into a Validator

A ConstraintValidator is a Spring bean, so it can use constructor injection — enabling rules that consult a repository or service, such as uniqueness checks.

public class UniqueEmailValidator
        implements ConstraintValidator<UniqueEmail, String> {
    private final UserRepository repo;
    public UniqueEmailValidator(UserRepository repo) { this.repo = repo; }
    @Override
    public boolean isValid(String email, ConstraintValidatorContext ctx) {
        return email == null || !repo.existsByEmail(email);
    }
}

Class-Level Constraints

Some rules span multiple fields — "password must equal confirmPassword." Target the annotation at TYPE and validate the whole object, accessing several fields together.

@Target(TYPE)
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordsMatchValidator.class)
public @interface PasswordsMatch {
    String message() default "Passwords do not match";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

Initialization Hook

Override initialize to capture attributes from the annotation instance, such as a configurable minimum length, before validation runs.

@Override
public void initialize(StrongPassword ann) {
    this.minLength = ann.minLength();
}

Keep Validators Pure and Fast

Validators run on every request, so keep them quick and side-effect-free where possible. Database-backed checks are fine but should be indexed and lightweight to avoid slowing request handling.

Quick Check

Test your understanding of custom validators.

Recap

Custom validators extend Bean Validation.

  • A constraint is an @Constraint annotation plus a ConstraintValidator
  • Override isValid; treat null as valid by convention
  • Validators are beans, so they support constructor injection
  • Use class-level constraints for cross-field rules
  • Customize messages via the validation context
Можно начать бесплатно

Изучай Java с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
24
Уроки
93

Часто задаваемые вопросы

Урок «Пользовательские валидаторы» бесплатный?

Да — полный текст урока «Пользовательские валидаторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Spring Boot 4 Microservices & REST APIs, подпишись на CoddyKit PRO. Курс Spring Boot 4 Microservices & REST APIs содержит 4 уроков всего.

Чему я научусь в уроке «Пользовательские валидаторы»?

Создавайте собственные ограничения проверки Ты практикуешь Spring Boot 4 Microservices & REST APIs с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Spring Boot 4 Microservices & REST APIs?

Предыдущий опыт не требуется. Spring Boot 4 Microservices & REST APIs на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Пользовательские валидаторы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Spring Boot 4 Microservices & REST APIs?

Да. Каждый урок Spring Boot 4 Microservices & REST APIs включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка бинов с помощью @Valid
  2. Пользовательские валидаторы
  3. @ControllerAdvice и @ExceptionHandler
  4. Детали проблемы (RFC 7807)
← Назад к Spring Boot 4 Microservices & REST APIs