概述

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

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

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

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

注解位置

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

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

如:

==================》》》》

如果@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;@MyConstraintprivate String className;

测试代码:

检验分组为IGroupA的情况

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

测试:

这里对分组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不进行校验,结果如下:

嵌套校验

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

举例:

需要约束校验的bean:

public class TeacherBean {@NotEmpty(message = "老师姓名不能为空,公众号:Java精选")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;@MyConstraintprivate String className;@NotNull(message = "任课老师不能为空")@Size(min = 1, message = "至少有一个老师")private List<TeacherBean> teacherBeans;

注意:

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

这里teacher中的type明显是不符合约束要求的,但是能检测通过,是因为在student中并没有做 嵌套校验。另外,java面试资料,公众号Java精选,回复java面试,获取面试资料。

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

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

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

作者:王大地X

https://blog.csdn.net/herojuice/article/details/86020101

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

Java精选面试题(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,在看,转发吧!

别再乱用了,这才是 @Validated 和 @Valid 的真正区别和用法!相关推荐

  1. 别再乱用了,这才是 @Validated 和 @Valid 的真正区别!!!

    1. 概述 ● @Valid是使用Hibernate validation的时候使用 ● @Validated是只用Spring Validator校验机制使用@Validation对@Valid进行 ...

  2. 妈,别再乱买保健品了!

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 又是一年315! 今年 315 晚会被大家一如既往吐槽了,但小探又留意到了保!健!品!借 "健康讲座"之名,向老人推销保健品 ...

  3. 服务器ip会被微信屏蔽吗,别再乱填自己的微信地址,否则分分钟会很麻烦!

    原标题:别再乱填自己的微信地址,否则分分钟会很麻烦! 估计经常使用微信的人都会发现 身边不少朋友的微信资料 都会显示他们来自同一个地方 这个地方就是安道尔 安道尔在哪里?这个问题无数人都问过- 而你随 ...

  4. 魔兽70服修复比较好的服务器,魔兽怀旧服:TBC版本到来之前,最值得做的三件事,别再乱花钱...

    游戏中我们是朋友,聊天侃地,在这里我们可以无拘无束地发言,不会有任何人阻挠,还有大家最喜欢喷的小编,请把口水收集好,随时准备和小编一起对喷! 魔兽怀旧服TBC版本到来之前,最值得做的三件事,别再乱花钱 ...

  5. 惠普178nw芯片清零_惠普打印加粉后怎么清零?别再找了,这才是正确的

    原标题:惠普打印加粉后怎么清零?别再找了,这才是正确的 1.HP 4000/4050/4100/5000 (1)按"项目"键左端加"数值"键左端开机 (2)当液 ...

  6. 别再乱打日志了,这样才是定位 bug 打日志的方式!

    欢迎关注方志朋的博客,回复"666"获面试宝典 概述 日常工作中,程序员需要经常处理线上的各种大小故障,如果业务代码没打印日志或者日志打印的不好,会极大的加大了定位问题的难度,使得 ...

  7. 别再乱用 Prometheus 联邦了,分享一个 Prometheus 高可用新方案

    作者 | 浪子燕青燕小乙 来源 | https://zhuanlan.zhihu.com/p/368868988 前言 我看到很多人会这样使用联邦:联邦 prometheus 收集多个采集器的数据 实 ...

  8. 尺寸不会再乱 主板板型规格知识大解析

    源网址:http://mb.zol.com.cn/438/4384423_all.html#p4393724 发展至今极为成熟 ATX规范统治世界 假如我们准备攒机,那么我们首先需要确定自己的需求,确 ...

  9. Java 18 正式发布,默认 UTF-8,finalize 被弃用,别再乱用了!

    JDK 18 正式发布 JDK 17 刚发布半年,JDK 18 又如期而至,JDK 版本号这算是成年了? JDK 18 发布了,栈长继续为大家解读! JDK 18 延续了 JDK 17 开创的免费策略 ...

  10. 千万别再乱点黄色APP了!

    上一篇:文心一言员工跳槽工资翻倍,猎头:百万年薪很正常 网络诈骗千千万,涉黄APP占一半. 小伙来自山东菏泽,失手在手机上下载了非法的涉黄APP,当他准备观看视频时发现,需要充值成为会员或完成任务才能 ...

最新文章

  1. 不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib
  2. 解读 Q_D, Q_Q 指针
  3. 关于python读取文件的规则
  4. 消防信号二总线有没电压_春晓161#地块人防工程消防电源监控系统的设计与应用...
  5. 【Top1】Tudou.com首页网页设计的制作方法
  6. 移动app测试的多样性_快速搞定APP移动端自动化测试
  7. magento effects.js jquery.lazyload.js 冲突
  8. ORA-12011+ORA-06512–job执行失败问题
  9. sql增删改查_面试速记之数据库增删改查|附思维导图
  10. ios13.5.1降级_高并发系统下的降级如何实现
  11. RemObjects SDK简介
  12. mac谷歌浏览器怎么登陆账户_Mac如何安装谷歌浏览器 Mac安装谷歌浏览器的方法...
  13. 新消费业内人说不出口的10个问题
  14. IT大学生应该经常浏览的十大网站
  15. PWM原理 PWM频率与占空比详解
  16. 个人网站如何申请支付接口?(教程)
  17. java deflate_Java实现deflate算法的压缩和解压
  18. JAVA获取百度网盘下载真实地址
  19. 英文歌曲:Yesterday Once More(昨日重现)
  20. flac如何转换成wav?

热门文章

  1. MAC版“迅雷 意外退出”
  2. 第15课 模块与包
  3. vue Emitter
  4. 2017《Java技术预备作业1》计科1502杨雪莹
  5. webrtc视频卡顿分析一本地视频卡顿
  6. switch语句练习题
  7. Excel入门(一)
  8. php使用grpc(windows环境下)
  9. 初涉Workflow(2)——XPDL
  10. 在线翻译PDF文件用什么方法