我们知道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()

本文探讨了在Java中使用javax的@Valid注解进行递归验证时遇到的问题,特别是当涉及到泛型时,ValidatorImpl.validate方法无法正确处理泛型参数,导致验证失败。
1082

被折叠的 条评论
为什么被折叠?



