Мне нужно реализовать пользовательский Hibernate Constraint Validator, отличный от стандартного способа.
Обычный способ:
@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE,
ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {MyValidator.class})
@Documented
public @interface MyAnnotation {
String message() default "ReferenceData Value is not valid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
CachingReferenceDataSetName name();
}
Где validatedBy = {MyValidator.class} указывает фактическийвалидатор для структур данных, аннотируемых MyAnnotation
Проблема заключается в том, что этот валидатор должен работать поверх механизма кэширования, который, в свою очередь, при выполнении внешнего http-вызова в случае сбоя.
Я бынеобходимо иметь возможность обеспечить реализацию валидатора во время выполнения (при создании валидатора hibernate), чтобы избежать внесения всего кода в проект сущностей
Я проверил API и вижу, что существуют разные способыдобавление ValidatorProviders и ConstraintValidationFactories, но их сложно построить
То есть, что я сделал
ValidatorFactory factory =
Validation.byDefaultProvider().providerResolver(new
ValidationProviderResolver() {
@Override
public List<ValidationProvider<?>> getValidationProviders() {
return Lists.newArrayList(new HibernateValidator(), ??);
}
}).configure().buildValidatorFactory();
Где вы видите ??выше, предполагается передать новый Validator, но этот объект слишком сложен для построения.Если я только передам новый HibernateValidator) в этом списке, то это допустимый рабочий валидатор, но без «дополнительного» класса валидации, который мне нужно предоставить в проекте наследования
Я также попытался добавить пользовательский ConstraintValidationFactory
ValidatorFactory factory =
Validation.byProvider(HibernateValidator.class)
.configure().constraintValidatorFactory(
new MyConstraintValidationFactory()
).buildValidatorFactory();
Но затем он пытается использовать это для разрешения КАЖДОГО ограничения
Все, что мне нужно в основном, - это иметь возможность создать HibernateValidator, содержащий все стандартные ограничения + дополнительное реализованное ограничение, добавленное программно, котороебудет найдено, когда поле validatedBy в @Constraint имеет интерфейс типа (что недопустимо)
Другими словами
Проект A Содержит
@MyAnnotation
@Constraint(validatedBy = MyAbstractClass.class)
Проект B
Creates HibernateValidator containing a MyAbstractClassImpl(validator
implementation) bound to the above annotation
Reason is that MyAbstractClassImpl cannot reside in the Project A!