@Validated 和 @Valid的区别

总的来说,两者都是用于参数校验;@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();
    }
}

 

  • @NotNull 常用在数据类型为Long,Integer的基础数据类型上,可以配合@Size、@Max、@Min对数值进行大小的控制
  • @NotEmpty 常用在集合类和数组类型上,也可以配合@Size进行大小的控制
  • @NotBlank 只用于String数据类型上,可以和@Len配合使用限制字符长度

 

参考文章

【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注解

posted @ 2024-03-25 20:19  先娶国王后取经  阅读(144)  评论(0编辑  收藏  举报