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

javax的Valid注解对泛型失效

request的结构分别如下:

javax的Valid注解对泛型失效

javax的Valid注解对泛型失效

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

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

javax的Valid注解对泛型失效


为什么呢?

因为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()


相关文章:

  • 2021-07-26
  • 2022-12-23
  • 2021-08-21
  • 2017-11-24
  • 2022-12-23
  • 2021-09-19
  • 2021-04-07
猜你喜欢
  • 2021-04-27
  • 2021-05-03
  • 2022-12-23
  • 2021-10-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案