总的来说,两者都是用于参数校验;@Validated额外支持分组验证机制,@Valid额外支持嵌套验证机制
- Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种);校验不通过的时候程序就会抛出org.springframework.validation.BindException 的异常(一般用全局异常处理类来捕获);
- javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果;
两者重要区别
分组
@Validated提供了一个分组功能,而@Valid不支持分组
注:不分配groups时,默认每次都要进行验证
使用范围上
- @Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
- @Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
嵌套验证
public class Item {
@NotNull(message = "id不能为空")
@Min(value = 1, message = "id必须为正整数")
private Long id;
@NotNull(message = "props不能为空")
@Size(min = 1, message = "至少要有一个属性")
private List<Prop> props;
}
public class Prop {
@NotNull(message = "pid不能为空")
@Min(value = 1, message = "pid必须为正整数")
private Long pid;
@NotNull(message = "vid不能为空")
@Min(value = 1, message = "vid必须为正整数")
private Long vid;
@NotBlank(message = "pidName不能为空")
private String pidName;
@NotBlank(message = "vidName不能为空")
private String vidName;
}
@RestController
public class ItemController {
@RequestMapping("/item/add")
// 无论入参采用@Validated还是@Valid验证,Spring Validation框架只会对Item的id和props做非空和数量验证,不会对props字段里的Prop实体进行字段验证
// 即如果传的List<Prop>中有Prop的pid为空或者是负数,入参验证不会检测出来
public void addItem(@Validated Item item) {
doSomething();
}
}
参考文章
【1】https://blog.csdn.net/qq_27680317/article/details/79970590
【2】https://cloud.tencent.com/developer/article/2039849
【3】https://blog.csdn.net/sunnyzyq/article/details/103527380
【4】常用@Valid注解
标签:验证,区别,private,Valid,为空,message,Validated From: https://www.cnblogs.com/ReturnOfTheKing/p/18095184