Связывание валидатора гибернации во время выполнения - PullRequest
0 голосов
/ 22 января 2019

Мне нужно реализовать пользовательский 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...