我需要以不同于标准方式的方式实现自定义的休眠约束验证器。
通常的方法是:
@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!