I created 2 custom validators.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = ISODateValidator.class)
public @interface ISODateConstraint {
String message() default "Field is not a valid iso date";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ISODateValidator implements ConstraintValidator<ISODateConstraint, String> {
@Override
public void initialize(ISODateConstraint constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
try {
LocalDate.parse(s);
} catch (DateTimeParseException e) {
return false;
}
return true;
}
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = AgeValidator.class)
public @interface AgeConstraint {
String message() default "Age is not in required range";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int min();
int max();
}
public class AgeValidator implements ConstraintValidator<AgeConstraint, String> {
private int min;
private int max;
@Override
public void initialize(AgeConstraint constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
LocalDate date;
try {
date = LocalDate.parse(s);
} catch (DateTimeParseException e) {
return false;
}
return ( LocalDate.now().minusYears(min).isAfter(date) || LocalDate.now().minusYears(min).isEqual(date))
&& ( LocalDate.now().minusYears(max).isBefore(date) || LocalDate.now().minusYears(max).isEqual(date));
}
}
And used them on field
@AgeConstraint(min = 13, max = 100)
@ISODateConstraint
private String dateOfBirth;
I care about validation message so order of execution is relevant. Now when i provide string like "2022-13-12" validation should fail on ISODateConstraint and return related message. What i get is message related to AgeConstraint.
I checked execution with debugger and ISODateValidator is always executing first and always returns false. Despite this execution goes further into ISODateValidator.