有时候明明一个微服务里的@Validated 和 @NotBlank 用的好好的,但就是另一个里不能用,这时候问题是最不好排查的,下面列举了各种失效情况的汇总,供各位参考:
1、版本问题
springboot切换到2.3.2.RELEASE后失效,将版本换成2.2.2.RELEASE后即可使用正常。原因如下图所示,此时则需要手动加入依赖包进行支持。
![1fb8cbf57b8bc31d48dbca32de47f899.png](https://i-blog.csdnimg.cn/blog_migrate/005ef4a79b876ec5cc7919a5ec544263.jpeg)
需要添加的依赖:org.hibernate.validator hibernate-validator 6.0.17.Finalcompile
2、使用规范问题
如果只在参数类的属性上使用@NotBlank注解,但是在Controller方法的参数前面没有使用@Validated,那也不会生效,正确应该如下图所示:
![24d97bada8ebe68859f1b86f58dc9665.png](https://i-blog.csdnimg.cn/blog_migrate/5e5672fd2445cb602397f6bda599d27e.jpeg)
![788cc9acafecb573986a7cdd470245ad.png](https://i-blog.csdnimg.cn/blog_migrate/27f73dc4248ad3e0ee4feb4d9f1e527a.jpeg)
如果有嵌套情况,则需要在类的属性上也要加@Valid进行支持,否则被嵌套的参数也是失效的。
3、组校验标记不一致
哪些标记要一致?简单的说是数据类中的标记和所使用数据类controller方法中的标记不一致;例如:
数据传输类User 的id字段被标记在了Add组,name既在Add组,又在Update组。
![1b13fa78c4c30f0c527c18d1819d9f11.png](https://i-blog.csdnimg.cn/blog_migrate/cc8d9cca97dd44bd47be0f95691ff975.jpeg)
一个接口中可定义多组分别校验
![356d92ff915fec5da5fcca74a604dba6.png](https://i-blog.csdnimg.cn/blog_migrate/4ce89d3f2552b9a8bc6551c55d9e24a5.jpeg)
id只有在新增的时候可以为空
![2f4c678a25bf995613bcb7469556c346.png](https://i-blog.csdnimg.cn/blog_migrate/e33f2ab160da5dfa35926ea43dc318d4.jpeg)
1、id被标记了Add组,但是controller中新增方法的@Validated没有使用该组(@Valid不支持组校验),则id上所标记的“id不能为空”将是不生效的,postman的测试结果验证了改结论
![025f72f3c033683d253bb31c96ad336b.png](https://i-blog.csdnimg.cn/blog_migrate/609c810995010ba848f371d33468ad53.jpeg)
2、调用更新接口,更新接口方法的@Validated中有Add、Update ,表示user中所有被标记了Add和Update组的属性字段都会生效,postman调用结果如下
![58d80598c374302088dc351acaed507b.png](https://i-blog.csdnimg.cn/blog_migrate/56b353a2c152ed3f79a70350b8e83027.jpeg)
可见被标记的所有字段都被成功校验!