javax的Valid注解对泛型失效

我们知道javax的@Valid注解的效果是递归下去的。比如有一个如下的Controller:


request的结构分别如下:



那么QueryContractRequest的chainId字段上面的Min注解是会生效的。

但是,如果ApiBaseRequest的定义如下,及使用了泛型,那么QueryContractRequest的chainId字段上面的Min注解不会生效。



为什么呢?

因为javax的校验实现ValidatorImpl.validate(T object, Class<?>... groups)(是hibernate包里的),读取了最外层类型的编译时结构,而非运行时类型,所以泛型就失效了。

这里面有个临时变量ValueContext.currentValidatable,这个属性的值是BeanMetaDataManager.getBeanMetaData( object.getClass() ) 这个里面取的是编译时的类型,这个object就是某个参数,而非运行时。

ValidatorImpl.validateCascadedConstraints(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext)

里面拿到一个属性的value后,应该通过value.getClass()来重新计算设定类类型,这样可以支持泛型。而非直接调用Cascadable(PropertyMetaData).getTypeArgumentsConstraints()