Найти в Дзене
84 подписчика

🖥 Java. Как обозначить аннотацией, что дата не раньше определённой?


Дан класс Film, у которого поле типа LocalDate должно быть не раньше 28 декабря 1895 года. Используем библиотеку javax.validation.constraints, где представлены @Past, @Future, @FutureOrPresent, @PastOrPresent.

Для этой цели создадим свою кастомную аннотацию и валидатор. Пример статьи на эту тему

Класс аннотации

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MinimumDateValidator.class)
@Past
public @interface MinimumDate {
String message() default "Date must not be before {value}";
Class<?>[] groups() default {};
Class<?>[] payload() default {};

String value() default "1895-12-28";
}

Кастомный класс валидатора, который будет эту аннотацию обрабатывать

public class MinimumDateValidator implements ConstraintValidator<MinimumDate, LocalDate> {
private LocalDate minimumDate;

@Override
public void initialize(MinimumDate constraintAnnotation) {
minimumDate = LocalDate.parse(constraintAnnotation.value());
}

@Override
public boolean isValid(LocalDate value, ConstraintValidatorContext context) {
return value == null || !value.isBefore(minimumDate);
}
}

Для таких целей придется создать свою кастомную аннотацию и валидатор. Пример статьи на эту тему

Класс аннотации

@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MinimumDateValidator.class)
@Past
public @interface MinimumDate {
String message() default "Date must not be before {value}";
Class<?>[] groups() default {};
Class<?>[] payload() default {};

String value() default "1895-12-28";
}

Кастомный класс валидатора, который будет эту аннотацию обрабатывать

public class MinimumDateValidator implements ConstraintValidator<MinimumDate, LocalDate> {
private LocalDate minimumDate;

@Override
public void initialize(MinimumDate constraintAnnotation) {
minimumDate = LocalDate.parse(constraintAnnotation.value());
}

@Override
public boolean isValid(LocalDate value, ConstraintValidatorContext context) {
return value == null || !value.isBefore(minimumDate);
}
}
Пример использования

public class Person {
@MinimumDate
private LocalDate birthDate;
}

1 минута