在运行时进行Hibernate Validator绑定

时间:2019-01-22 12:41:37

标签: java hibernate validation

我需要以不同于标准方式的方式实现自定义的休眠约束验证器。

通常的方法是:

@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调用时反过来。

我需要能够在运行时(创建休眠验证器时)提供验证器的实现,以避免将所有代码带入实体项目中

我检查了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 +一个以编程方式添加的额外实现的约束,当@Constraint中的validatedBy字段属于类型接口时,会发现该约束(这是不允许的)

换句话说

项目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!

0 个答案:

没有答案
相关问题