См http://docs.oracle.com/javaee/7/api/javax/validation/Constraint.html
Во-первых, обратите внимание, что validatedBy
является Class<? extends ConstraintValidator<?,?>>[]
, что это массив, а не один класс.
Во-вторых, нет смысла использовать интерфейс или абстрактный класс, потому что этот класс необходимо создать.
Но, если вы хотите изменить реализацию валидатора в среде выполнения, попробуйте использовать это:
public class MyValidator implements ConstraintValidator<MyAnnotation, String> {
//store the Class information in a static variable
private static Class<? extends ConstraintValidator<MyAnnotation, String>> implementationClass = MyValidatorOne.class;
//and change it by an accessor
public static void setImplementationClass(Class<? extends ConstraintValidator<MyAnnotation, String>> implClass) {
this.implementationClass = implClass;
}
//this delegate will do all the job
private final ConstraintValidator<MyAnnotation, String> implementation;
public MyValidator() {
implementation = implementationClass.newInstance();
}
@Override
void initialize(MyAnnotation constraintAnnotation) {
implementation.initialize(constraintAnnotation);
}
@Override
boolean isValid(T value, ConstraintValidatorContext context) {
return implementation.isValid(value, context);
}
}
где-то в коде:
MyValidator.setImplementationClass(MyValidatorTwo.class);
Но есть одна проблема. Скорее всего, экземпляр каждого валидатора создается один раз во время выполнения для одного класса - при первом вызове проверки на объекте этого класса. Изменение реализации вступит в силу только после этого.
Другой способ - хранить значения implementationClass
во внешнем классе, например java.util.Properties или класс, который выбирает доступные реализации с некоторым приоритетом.
Из интереса, какой был бы ваш прецедент для этого? – Gunnar
Упаковка. Мне нужно проверять классы сущностей, которые находятся в отдельном проекте, который не должен зависеть от проекта impl, где мне бы хотелось, чтобы классы валидатора были. –
Ах, всегда хорошо знать мотивацию :) Написал ответ на это. – Gunnar