public interface ConstraintValidator<A extends Annotation, T> {
default void initialize(A constraintAnnotation) { }
default boolean isValid(T value, ConstraintValidatorContext context) {
return isValid(value);
}
boolean isValid(T value);
}
public interface ConstraintValidatorFactory {
<T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key);
void releaseInstance(ConstraintValidator<?, ?> instance);
<A extends Annotation> void register(Class<A> annotation, ConstraintValidator<A,?> validator);
<A extends Annotation> ConstraintValidator<? extends Annotation, ?> resolve(Class<A> annotation);
}
ConstraintValidatorFactory cvf = factory.getConstraintValidatorFactory();
cvf.register(Directory.class, (ConstraintValidator<Directory, File) File::isDirectory);
cvf.register(Writable.class, (ConstraintValidator<Writable, File) File::canWrite);