首页 > 其他分享 >@Validated 和 @Valid的区别

@Validated 和 @Valid的区别

时间:2024-03-25 20:22:05浏览次数:24  
标签:验证 区别 private Valid 为空 message Validated

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

相关文章

  • 桥接模式和适配器模式的区别
    桥接模式和适配器模式的区别_桥接和适配器的区别-CSDN博客共同点桥接和适配器都是让两个东西配合工作不同点 出发点不同。     1)适配器:改变已有的两个接口,让他们相容。     2)桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离。    所以说......
  • 空指针、野指针和const修饰指针的区别
    关键:空指针和野指针都不允许访问,否则会报错。空指针指向变量中内存编号为0的空间用途1.初始化指针变量,并且空指针指向的内存不能进行解引用intmain(){ //指针变量p指向内存地址编号为0的空间 int*p=NULL; //访问空指针报错 //内存编号0~255为系统占用内......
  • 视觉伺服和电机伺服有什么区别呢?
    问题描述:视觉伺服和电机伺服有什么区别呢?问题解答:视觉伺服和电机伺服在控制对象和实现原理上有一些区别:控制对象:视觉伺服:控制对象是通过视觉传感器获取的图像信息。它利用这些信息来实现对机器人或其他自动化系统的控制和调整。电机伺服:控制对象是电机或执行器。电机伺服......
  • vue2和vue3的主要区别#记录
    一、 vue2和vue3的区别1、vue2和vue3双向数据绑定原理发生了改变vue2 的双向数据绑定是利用ES5的一个API Object.definePropert()对数据进行劫持结合发布订阅模式的方式来实现的。vue3 中使用了es6的 ProxyAPI对数据代理。相比于vue2.x,使用proxy的优势如下de......
  • Java中String、StringBuffer、StringBuilder 的区别
    目录1.String2.StringBuffer3.StringBuilder4.使用情况如果帮助到你,别忘了点赞收藏关注String、StringBuffer和StringBuilder在Java中都用于处理字符串数据,但它们之间在功能和性能上有一些关键的区别:1.String不可变性:String类的对象是不可变的。每次对String对......
  • StringUtils的isBlank和isEmpty区别
    (1)引入common-lang包(2)运行结果(3)isBlank的源码(4)isEmpty的源码结论isBlank:值为null或者值具有空格(比较时会去除空格)和空白字符串,会返回trueisEmpty:值为null或者空白字符串时候才会返回true,有空格字符串会被认定为非空,返回false......
  • 面试官:说一说 Spring 与 SpringBoot 的区别?
    Spring为开发Java应用程序提供了全面的基础架构支持,它将Java对象交由容器统一管理,从而实现控制反转(IOC)和依赖注入(DI),并提供了一些常用模块如SpringAOP、SpringJDBC、SpringMVC等等SpringBoot继承了Spring的核心思想,并进一步简化应用开发Spring和SpringBoot的区别主......
  • ${VAR:=默认值}和${VAR:-默认值} 区别
    当然可以,以下是${VAR:=默认值}和${VAR:-默认值}在实际使用中的例子:例子1:使用${VAR:=默认值}bash复制代码 #!/bin/bash   #假设VAR变量尚未设置 echo"原始VAR的值:$VAR"#输出:原始VAR的值:(空行)   #使用${VAR:=默认值} echo"V......
  • drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(va
    source,SerializerMethodField,局部钩子,全局钩子serialzer.py:source用处对应字段:起别名,用处2对应方法:在表模型中定义一个方法,source可以与其关联用处3对应方法:可以当做字段第三种方法的扩展用法:使用程度高。model.pyfromdjango.dbimportmodels#Createyourmo......
  • Drop 、Delete、Truncate的区别是什么
    Drop、Delete、Truncate的区别是什么?DROP删除表结构和数据,truncate和delete只删除数据truncate操作,表和索引所占用的空间会恢复到初始大小;delete操作不会减小表或索引所占用的空间;drop操作释放表或索引的占用空间。truncate和drop是DDL,操作立即生效,delete是DML,......