《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 ...
最新文章
- (字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)
- iOS- UITableView could not hold the selected row after reload
- 对人工智能问题的提问
- Nginx URL重写(rewrite)配置及信息详解
- 关于Android studio3.0的坑之butterknife 7.0.1(低版本)
- python matplotlib 画一条水平直线遇到的问题
- Spring-jdbc-AbstractRoutingDataSource
- 双目标定,匹配的笔记
- 数组指定位置添加元素_访问数组的任意位置元素的性能真的一样?
- 2018-12-26 课堂笔记 for循环
- 最新Tuxera NTFS for mac2020读写NTFS磁盘工具 更新详情介绍
- EXCEL IFS函数的使用
- 微信小程序抖音实战-小视频弹幕
- 可用性SLA还不懂?看完这个故事就懂了........ | 凌云时刻
- 网络协议TCP/IP、IPX/SPX、NETBEUI简介
- vue 中动态添加组件方式
- 自定义DatetimePicker起始默认值
- java实现输入数字 输出金额_JAVA实现数字大写金额转换的方法
- 浅谈LigerUi Tree(树)
- p语言是python吗-python编程语言是什么?它能做什么?
热门文章
- 如何在UEFI模式下安装64位win7系统
- 【疑难教程】如何解决推流摄像头推RTMP视频流至EasyDSS视频直播点播平台Chrome浏览器无法播放?
- Caesars Cipher
- 爬取豆瓣音乐TOP250数据保存到csv文件和xls文件
- 工作中办公文件共享用什么软件比较便捷?
- 程序员值得收藏的网站(持续更新)
- unity 如何检测vr htc vive 头盔是否佩戴
- 论文阅读 2DPASS: 2D Priors Assisted SemanticSegmentation on LiDAR Point Clouds LiDAR
- NestJS 6.x折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础
- 【推荐系统】短视频推荐系统概述