《SpringBoot篇》12.@Valid与@Validated的区别
陈老老老板 说明:工作了,学习一些新的技术栈,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。
1.介绍
说明: 其实@Valid 与 @Validated都是做数据校验的,只不过注解位置与用法有点不同。
不同点:
(1)
@Valid是使用Hibernate validation的时候使用。@Validated是只用Spring Validator校验机制使用。
(2)
@Valid 可以嵌套验证
@Validation 不能进行嵌套验证
(3)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上。
@Validated:用在类、方法和方法参数上。但不能用于成员属性(field)。
(如果@Validated注解在成员属性上,则会报不适用于field的错误。)
(4)
@Valid:没有分组功能。
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制。
2.用法
(1)@Valid用法
a.导入依赖
SpringBoot项目:
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version>
</dependency>
b.使用前提是实体类中属性使用注解进行校验
package com.example.demo.pojo;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;//lombok
@Data
public class User implements Serializable {//用户名@NotBlank(message = "请输入名称")@Length(message = "名称不能超过个 {max} 字符", max = 10)private String username;//年龄@NotNull(message = "请输入年龄")@Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100)private String age;}
c.在Controller方法参数中加上@Valid注解
package com.example.demo.controller;import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import java.util.List;@RestController
public class UserController {public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBodypublic String add(@Validated User user, BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();allErrors.forEach( v ->{logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return "添加失败";}return "添加成功";}
}
经过测试填写错误数据,会在控制台输出报错信息。
(2)@Validated用法
a.开启校验框架(与上面一样)
<!--1.导入JSR303规范-->
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId>
</dependency>
c.在需要开启校验功能的类上使用注解@Validated开启校验功能,对具体的字段设置校验规则,这里讲的是可以在类上使用@Validated注解,配合xml数据绑定。
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {//设置具体的规则@Max(value = 8888,message = "最大值不能超过8888")@Min(value = 202,message = "最小值不能低于202")private int port;
}
(3)@Validated实现分组校验
注意 分组校验就是把条件加入组中,可以自由选择开启那些组的校验方式。
a.分组接口
package com.example.demo.pojo;public interface Group {interface Update{};interface FindAll{};
}
b.实体类
package com.example.demo.pojo;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;//lombok
@Data
public class User implements Serializable {//用户名@NotBlank(message = "请输入用户名不能为空",groups = {Group.FindAll.class})@Length(message = "名称不能超过个 {max} 字符", max = 10 ,groups = {Group.FindAll.class})private String username;//年龄@NotBlank(message = "请输入年龄不能为空",groups = {Group.Update.class})@Range(message = "年龄范围为 {min} 到 {max} 之间", min = 1, max = 100,groups = {Group.Update.class})private String age;}
c.controller接口:
注意 @Validated有参数 value中写分组名称
package com.example.demo.controller;import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import java.util.List;@RestController
public class UserController {public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBody//注意@Validated有参数 value中写分组名称public String add(@Validated(value = {Group.Update.class}) User user, BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();allErrors.forEach( v ->{logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return "添加失败";}return "添加成功";}
}
(4)@Valid 实现嵌套校验
注: 嵌套检测就是在一个User类中,存在另外一个User2类的属性。嵌套检测User同时也检测User2。
a.实体类User
package com.example.demo.pojo;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;//lombok
@Data
public class User implements Serializable {//用户名@NotBlank(message = "请输入用户名不能为空1")private String username;//年龄@NotBlank(message = "请输入年龄不能为空1")private String age;@Valid@NotNull(message = "user2不能为空1")private User2 user2;}}
b.实体类User2
package com.example.demo.pojo;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;package com.example.demo.pojo;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;import javax.validation.constraints.NotNull;
import java.io.Serializable;//lombok
@Data
public class User2 implements Serializable {//用户名@Length(message = "名称不能超过个 {max} 字符2", max = 10 )private String username2;//年龄@Range(message = "年龄范围为 {min} 到 {max} 之间2", min = 1, max = 100)private String age2;}
c.Controller类(这里使用@Valid)
package com.example.demo.controller;import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import java.util.List;@RestController
public class UserController {public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());@PostMapping("/add")@ResponseBodypublic String add(@Valid User user, BindingResult bindingResult){if(bindingResult.hasErrors()){List<ObjectError> allErrors = bindingResult.getAllErrors();allErrors.forEach( v ->{logger.error(v.getObjectName()+"======"+v.getDefaultMessage());});return "添加失败";}return "添加成功";}
}
总结:了解这两个注解可以让你的校验数据更加方便。希望对您有帮助,感谢阅读
结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。
《SpringBoot篇》12.@Valid与@Validated的区别相关推荐
- 常用校验注解@NotEmpty,@NotBlank,@NotNull,@Valid,@Validated用法区别,以及搭配 BindingResult使用,嵌套验证等《使用|CSDN创作打卡》
文章目录 一.常用注解@NotEmpty,@NotBlank,@NotNull介绍 二.@Valid与@Validated的使用与区别 2.1@Valid与@Validated区别: 2.2嵌套验证 ...
- 一文探知@Valid和@Validated 的区别
使用spring boot开发的道友们,或许或多或少有用到过这两个注解,那么今天我们就来探查一下这两者的异同. 两者都可以使开发人员写的注解校验规则生效,例如在某一个字段上加上@NotNull.@No ...
- @Valid和@Validated验证List集合--网络踩坑记录
基于Springboot框架验证list只需要一下两步: 在Controller上添加@Validated注解,方法上添加@Valid注解,就能验证了 实体类: 情况二.只是用@Valid,并且不是S ...
- 校验注解:@Valid 和 @Validated区别与用法(附详细案例)
一.案例对象 本文章会以案例为主,讲解@Valid 和 @Validated这两个注解的区别与用法. 1.首先,创建一个学生对象,如下: import lombok.Data;/*** 学生对象*/ ...
- validated 验证数组_Spring Boot 快速入门系列(VIII)—— 数据校验篇之 @Valid @Validated...
点击上方蓝色字体关注我吧 一起学习,一起进步,做积极的人! 场景描述: 你还在业务代码或是控制层中校验接口传入参数的有效性和合法性吗?还是只做了前端参数校验,后端接口直接放行?这样的话,程序运行的正确 ...
- @Valid与@Validated区别
1.@Valid与@Validated作用 @Valid与@Validated都是用来校验接收参数的.@Valid是使用Hibernate validation的时候使用@Validated是只用Sp ...
- Springboot 参数校验@Valid @Validated(最新最全)
Springboot 参数校验@Valid @Validated(最新最全) 提示:统一参数校验,异常处理 文章目录 Springboot 参数校验@Valid @Validated(最新最全) 前言 ...
- @Validated注解详解,分组校验,嵌套校验,@Valid和@Validated 区别,Spring Boot @Validated
技术栈: spring boot 2.3.3.RELEASE hibernate-validator 文末附项目源代码 目录 简述 项目依赖 全局异常处理类 基础参数校验 实体类 控制类 测试 嵌套参 ...
- valid 和 validated的使用小结
[技术分享]Bean Validation使用篇 2020-07-09马平凡(鲁吉英) Bean Validation 使用篇 在开始文章之前,先讲一下为什么会写这篇文章,以及阅读后的相应收益. Be ...
最新文章
- selenium--driver.switchTo()
- 微软为华为定制了一个“烂笔头小冰”,让人想起了老罗的“闪念胶囊”
- 公司来了个傻员工,改变了所有聪明的员工
- onload、DOMContentLoaded、$(document).ready(fn)、$(document).load(fn)
- pycharm pip安装_Python从入门到大师教程 | 一、搭建Python环境和安装Pycharm
- MAPREDUCE原理篇(1)
- qt 开发新问题QList使用小记
- 串级pid算法c语言实现,【开源】分享一个经典的串级PID算法,附源代码
- 快来加入阿里云大学【云学院】班级助理—机会稍纵即逝,错过遥遥无期
- 定制Hexo-NexT的个性化博客
- java 上传文件 md5_上传到文件选择器时的md5校验和
- vlookup使用步骤_VLOOKUP函数的使用方法详解
- python并行编程 - GPU篇
- JAVA中设置drwxr_x___权限_linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思
- 细思极恐啊,哈哈哈哈哈哈
- Android中 onTouchEvent() 与 onInterceptTouchEvent()事件的区别详解
- 泰勒公式求极限c语言switch,泰勒公式Ç
- 不用sim卡的手机号(阿里小号)
- 爬取网页数据所用到的方法-Selenium篇
- 记一次ThinkPHP框架错误解决处理!
热门文章
- 企业管理:如何规范员工上网行为,提高员工工作效率
- 台式计算机显示器点不亮的原因,台式电脑开机后显示器屏幕不亮有哪些原因?...
- uml中的各种符号表示什么意义与关系
- java建材公司管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
- 电脑网络怎么添加计算机,局域网添加打印机,教您局域网打印机怎么添加
- 腾讯地图PC端将停服;Meta发布VR头盔QuestPro,售价1500美元;Firefox OS 复活|极客头条...
- 高血压,注意什么,预防
- PAT 乙级 1072 开学寄语 python
- PHP递归经典算法实例
- 图片剪切工具Jcrop在JavaScript中使用