javax的Valid注解对泛型失效
我们知道javax的@Valid注解的效果是递归下去的。⽐如有⼀个如下的Controller:
request的结构分别如下:
那么QueryContractRequest的chainId字段上⾯的Min注解是会⽣效的。
但是,如果ApiBaRequest的定义如下,及使⽤了泛型,那么QueryContractRequest的chainId字段上⾯的Min注解不会⽣效。
为什么呢?
因为javax的校验实现ValidatorImpl.validate(T object, Class<?>... groups)(是hibernate包⾥的),读取了最外层类型的编译时结构,⽽⾮运⾏时类型,所以泛型就失效了。
这⾥⾯有个临时变量ValueContext.currentValidatable,这个属性的值是BeanMetaData(
ValidatorImpl.validateCascadedConstraints(ValidationContext<?> validationContext, ValueContext<?, Object> valueContext)
⾥⾯拿到⼀个属性的value后,应该通过Class()来重新计算设定类类型,这样可以⽀持泛型。⽽⾮直接调
⽤Cascadable(PropertyMetaData).getTypeArgumentsConstraints()