Springboot @Validated和@Valid的区别 及使用

Springboot @Validated和@Valid的区别 及使用概述 Valid 是使用 Hibernateval 的时候使用 Validated 是只用 SpringValida 校验机制使用说明 java 的 JSR303 声明了 Valid 这类接口 而 Hibernate validator 对其进行了实现 Validation 对 Valid 进行了二次封装 在使用上并没有区别 但在分组 注解位置 嵌套验证等功能上有所不同 这里主要就这

概述:

@Valid是使用Hibernate validation的时候使用

@Validated是只用Spring Validator校验机制使用

说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现

@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同,这里主要就这几种情况进行说明。

注解位置:

@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)

@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上

如: 

Springboot @Validated和@Valid的区别 及使用   ==================》》》》       Springboot @Validated和@Valid的区别 及使用    

如果@Validated注解在成员属性上,则会报  不适用于field错误

分组校验:

@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制

@Valid:没有分组功能

举例:

定义分组接口:

public interface IGroupA { } public interface IGroupB { }

定义需要检验的参数bean:

public class StudentBean implements Serializable{ @NotBlank(message = "用户名不能为空") private String name; //只在分组为IGroupB的情况下进行验证 @Min(value = 18, message = "年龄不能小于18岁", groups = {IGroupB.class}) private Integer age; @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误") private String phoneNum; @Email(message = "邮箱格式错误") private String email; @MyConstraint private String className;

测试代码:

检验分组为IGroupA的情况

@RestController public class CheckController { @PostMapping("stu") public String addStu(@Validated({IGroupA.class}) @RequestBody StudentBean studentBean){ return "add student success"; } }

测试:

Springboot @Validated和@Valid的区别 及使用

这里对分组IGroupB的就没检验了

如果把测试代码改成下面这样,看看测试结果

@RestController public class CheckController { @PostMapping("stu") public String addStu(@Validated({IGroupA.class, IGroupB.class}) @RequestBody StudentBean studentBean){ return "add student success"; } }

说明:

1、不分 配groups,默认每次都要进行验证

2、对一个参数需要多种验证方式时,也可通过分配不同的组达到目的。

 

组序列:

默认情况下 不同级别的约束验证是无序的,但是在一些情况下,顺序验证却是很重要。

一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序。在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证。

举例:

定义组序列:

@GroupSequence({Default.class, IGroupA.class, IGroupB.class}) public interface IGroup { }

需要校验的Bean,分别定义IGroupA对age进行校验,IGroupB对className进行校验: 

public class StudentBean implements Serializable{ @NotBlank(message = "用户名不能为空") private String name; @Min(value = 18, message = "年龄不能小于18岁", groups = IGroupA.class) private Integer age; @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误") private String phoneNum; @Email(message = "邮箱格式错误") private String email; @MyConstraint(groups = IGroupB.class) private String className;

测试代码:

@RestController public class CheckController { @PostMapping("stu") public String addStu(@Validated({IGroup.class}) @RequestBody StudentBean studentBean){ return "add student success"; } }

测试发现,如果age出错,那么对组序列在IGroupA后的IGroupB不进行校验,即例子中的className不进行校验,结果如下:

Springboot @Validated和@Valid的区别 及使用

 

嵌套校验:

一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated。

举例:

需要约束校验的bean:

public class TeacherBean { @NotEmpty(message = "老师姓名不能为空") private String teacherName; @Min(value = 1, message = "学科类型从1开始计算") private int type;
public class StudentBean implements Serializable{ @NotBlank(message = "用户名不能为空") private String name; @Min(value = 18, message = "年龄不能小于18岁") private Integer age; @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误") private String phoneNum; @Email(message = "邮箱格式错误") private String email; @MyConstraint private String className; @NotNull(message = "任课老师不能为空") @Size(min = 1, message = "至少有一个老师") private List<TeacherBean> teacherBeans;

注意:

这里对teacherBeans只校验了NotNull, 和 Size,并没有对teacher信息里面的字段进行校验,具体测试如下: 

Springboot @Validated和@Valid的区别 及使用

这里teacher中的type明显是不符合约束要求的,但是能检测通过,是因为在student中并没有做 嵌套校验

可以在teacherBeans中加上 @Valid,具体如下:

 @Valid @NotNull(message = "任课老师不能为空") @Size(min = 1, message = "至少有一个老师") private List<TeacherBean> teacherBeans;

这里再来测试,会发现如下结果:

Springboot @Validated和@Valid的区别 及使用

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230517.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月18日 下午12:01
下一篇 2026年2月18日 下午12:22


相关推荐

  • TD-SCDMA的优势「建议收藏」

    TD-SCDMA的优势「建议收藏」TD-SCDMA的优势  第二代移动通信系统(2G)(如GSM和IS-95)利用成对频带,通过上下行链路,以FDD模式运行。这些系统的设计只适用于数字化话音和低比特率数据的传输,不能满足多媒体和高比特率数据业务中宽带数据传输量不断增长的需求。第三代移动通信系统(3G)可支持高话音容量和高比特率非对称业务,以及移动无线因特网业务。它的主要特征在于可向网络运营商提供最佳频谱效率和经济效益。对运营商来讲

    2022年10月3日
    4
  • img图片加载失败默认图片「建议收藏」

    img图片加载失败默认图片「建议收藏」<img:src=”item.goods_pic”onerror=”javascript:this.src=’../static/images/default.png’;”>转载于:https://www.cnblogs.com/techliang666/p/8876842.html

    2022年5月24日
    47
  • 走进音视频的世界——Matroska封装格式的介绍(二)「建议收藏」

    走进音视频的世界——Matroska封装格式的介绍(二)「建议收藏」Matroska封装格式非常灵活、兼容性好,既适用于本地文件存储又可以进行实时流传输。本篇文章主要探讨Matroska的编解码器映射,如何封装视频流、音频流、字幕流。如果要Matroska的介绍、功能和基本结构,请查看上一篇文章:走进音视频的世界——Matroska封装格式的介绍(一)。一、Matroska流Matroska有两种传输流:文件访问(存储)和实时流传输(直播)。1.文件存储Matroska是一种容器,支持把多媒体流封装成为文件,存储于本地。Matroska的开销很小,非常适合

    2025年11月20日
    5
  • poc测试环境准备_什么是poc测试?

    poc测试环境准备_什么是poc测试?PoC(ProofofConcept),即概念验证。通常是企业进行产品选型时或开展外部实施项目前,进行的一种产品或供应商能力验证工作。验证内容1、产品的功能。产品功能由企业提供,企业可以根据自己的需求提供功能清单,也可以通过与多家供应商交流后,列出自己所需要的功能;2、产品的性能。性能指标也是由企业提供,并建议提供具体性能指标所应用的环境及硬件设备等测试环境要求;3、产品的API适用性;4、产…

    2025年8月6日
    3
  • 如何让PPT转成PDF后占满整个页面

    如何让PPT转成PDF后占满整个页面将 PPT 转成 PDF 格式是我们日常经常会使用的 但有时候转换后的 PDF 文件总觉得尺寸不对 是怎么回事呢 要怎么转换才能让保存的 PDF 图片可铺满整个页面呢 首先我们要进行分辨确实是 PDF 文档页面尺寸不对 两侧或上下有空白 还是我们打开 PDF 的页面比例不对呢 可以将 PDF 的页面比例调整到 100 也就是实际大小再查看 如果仍不是我们想要的效果如下图中的图 1 则可进行下一步设置 其中最简单的方法则是利用 PPT 转 PDF 的其中一种方式虚拟打印 我们在打印时 在打印设置中将 布局 中的打印方向调整为横向 并将页面尺寸

    2025年9月14日
    6
  • Android快速转战Kotlin教程「建议收藏」

    Android快速转战Kotlin教程「建议收藏」前言kotlin是啥?这里就不用多说了,想必看这篇文章的童鞋肯定是有所了解的。那么这篇文章你可以收获什么?答:本文主要通过本人如何从java转战到kotlin并应用在实际项目中的个人经历,给大家提供一些学习思路、学习方法以及一些学习资料和个人总结。前提:你的项目(包含个人项目)即将开始用到kotlin(没有项目作为依托你会缺少十足的动力,而且缺少应用场景乘热打铁那也…

    2022年5月25日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号