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

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2023

У меня есть класс Film, у которого поле типа LocalDate должно быть не раньше 28 декабря 1895 года. Я использую следующую библиотеку javax.validation.constraints, где представлены @Past, @Future, @FutureOrPresent, @PastOrPresent. Возможно проблема решается созданием собственной аннотации? Подскажите пожалуйся, где об этом почитать.

import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;

import java.time.LocalDate;

@Data
@EqualsAndHashCode(exclude = {"id"})
public class Film {
    private int id = 0;
    @NotBlank
    private final String name;
    @Size(max=200)
    private final String description;
    @Future
    private final LocalDate releaseDate;
    @Positive
    private final int duration;
}

Ответы

▲ 1Принят

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

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

@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;
}