今天遇到了一个嵌套校验的问题,之前接口只是处理接收单个参数的实体类,现在因为需求变动需要接收多个参数实体类,也就是参数变成了实体类列表。因为之前校验我也没注意就用的是@validated,但是发现参数变成实体类列表的时候校验不生效了。后来经过面向百度变成找到了解决办法。。。
在解决这个问题之前我们先看一下@Valid和@validated的区别:
1. 分组
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。
2. 注解地方
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。
3. 嵌套验证
@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
以上三点就是@Valid和@validated的主要区别。那么问题就出在了嵌套验证上了,我开始使用的是@validated注解不支持嵌套校验所以参数改为参数类列表