相关文章推荐
帅气的登山鞋  ·  听说玩这些游戏能提升编程能力? - ...·  1 年前    · 
爱热闹的梨子  ·  你不配做我的“葫芦兄弟”_手机新浪网·  1 年前    · 
有爱心的爆米花  ·  “煤城”蝶变“智车城”--专题报道-中国共产 ...·  1 年前    · 
刚毅的酱肘子  ·  江苏省人民政府 建议提案办理结果公开 ...·  2 年前    · 
时尚的砖头  ·  吉林省能源局·  2 年前    · 
Code  ›  一个奇怪的HV000030: No validator could be found for constraint开发者社区
https://cloud.tencent.com/developer/article/2235106
被表白的橙子
2 年前
作者头像
烟雨平生
0 篇文章

一个奇怪的HV000030: No validator could be found for constraint

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 数字化之路 > 一个奇怪的HV000030: No validator could be found for constraint

一个奇怪的HV000030: No validator could be found for constraint

作者头像
烟雨平生
发布 于 2023-03-07 14:15:10
600 0
发布 于 2023-03-07 14:15:10
举报

一个新写的API报错了:

常规性校验一直这样写的老猿,表示惊呆了。

事出反常必有妖!!!

一、前言:Spring MVC的参数校验 Spring的参数校验会用到两个库:validation-api,hibernate-validator validation-api是一套标准,hibernate-validator实现了此标准 JSR-303 是Java EE 6 中的一项子规范,叫做BeanValidation,官方参考实现是hibernate-validator。

二、HV000030: No validator 这个错,一般有两种情况: (1)约束与对象属性不匹配,譬如在String 上使用javax.validation.constraints.Future就会报这个错 (2)没有对应的Validator

一下子觉得很奇怪,难道javax.validation.constraints.NotEmpty不能用在java.lang.String??

这有什么错呢!! 真的是没有Validator!?

如果有,会是这样的,以javax.validation.constraints.Future为例:

@NotEmpty是这样的

还真没有!! 但是@NotEmpty是有两个的 看了下线上在跑的的API,发现使用的是org.hibernate.validator.constraints.NotEmpty 。 刚才也看到了,也是没有对应Validator【此处有玄机??】 但是有一些与javax.validation.constraints.NotEmpty不一样的地方: 使用了两个元注解约束@NotNull和@Size(min=1) 对比着看一下:

也就是一个校验不需要一个专门的Validator也是可以的?

三、ComposingConstraints【组合约束】及源码

Debug看下: hibernate-validator在处理约束时,使用组合约束的概念【可扩展性好强】。 具体工作流程如下: (1)先递归校验组合约束。譬如javax.validation.constraints.NotEmpty中的@NotNull和@Size(min=1) (2)校验主约束,如果有则校验;否则,跳过。譬如javax.validation.constraints.NotEmpty (3)处理组合约束的校验结果。有三种策略:OR,AND,ALL_FALSE

org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree#validateConstraints(org.hibernate.validator.internal.engine.ValidationContext, org.hibernate.validator.internal.engine.ValueContext<?,V>, java.util.Set<javax.validation.ConstraintViolation>)

org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree#validateComposingConstraints

四、为什么会有这个一定会报错的javax.validation.constraints.NotEmpty呢?

大家都知道Spring Boot帮助我们做了一件脏活、累活【感恩】:依赖包的版本管理。难道此处有bug? 使用IDEA中的Maven Helper插件看一下:

Jump to Source ,可以看到,当前项目的pom.xml中显式引入2.0.1.Final的validator-api

Spring Boot1.5.13中使用的是1.1.0.Final

问了下当时添加此依赖的同学,反馈是从老项目中继承过来的,当时是为了解决JPA的一个问题。不过现在已经全部改用Mybatis,那么这个已经没有必要了。把项目所有的微服务check了一遍,发现只有这个项目有。去掉并回归了下,相关接口并没有受到影响。 OK,收工 (1)并不是每个注解约束都需要一个main validator (2)不要更改Spring Boot依赖库版本。除非真的很笃定是没有问题,并回归测试通过

 
推荐文章
帅气的登山鞋  ·  听说玩这些游戏能提升编程能力? - 腾讯云开发者社区-腾讯云
1 年前
爱热闹的梨子  ·  你不配做我的“葫芦兄弟”_手机新浪网
1 年前
有爱心的爆米花  ·  “煤城”蝶变“智车城”--专题报道-中国共产党新闻网
1 年前
刚毅的酱肘子  ·  江苏省人民政府 建议提案办理结果公开 对省十四届人大一次会议第3016号建议的答复(关于进一步优化提升长江岸线保护利用的建议)
2 年前
时尚的砖头  ·  吉林省能源局
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号