@Validated和@Valid的区别

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准JSR-303规范),配合 BindingResult 可以直接提供参数验证结果。

在检验 Controller 的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。

但是在分组、注解地方、嵌套验证等功能上两个有所不同:

1. 分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。

@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

2. 注解地方

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。

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

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

3. 嵌套验证

在比较两者嵌套验证时,先说明下什么叫做嵌套验证。比如我们现在有个实体叫做Item:

public class Item {

  @NotNull(message = "id不能为空")
@Min(value = 1, message = "id必须为正整数")
private Long id; @NotNull(message = "list不能为空")
@Size(min = 1, message = "list大小不可为0")
private List<String> list; @Valid // 嵌套验证必须用@Valid
@NotNull(message = "props不能为空")
@Size(min = 1, message = "至少要有一个属性")
private List<Prop> props;
}

Item的成员属性props必须加上@Valid注解支持嵌套验证功能。

Item带有很多属性,如下所示:

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;
}

属性这个实体也有自己的验证机制,比如属性和属性值id不能为空,属性名和属性值不能为空等。

现在我们有个 ItemController 接受一个Item的入参,想要对Item进行验证,如下所示:

@RestController
public class ItemController { @RequestMapping("/item/add")
public void addItem(@Validated Item item, BindingResult bindingResult) {
doSomething();
}
}

此时Item里面的props如果含有Prop的相应字段为空的情况,Spring Validation框架就会检测出来,bindingResult就会记录相应的错误。

添加依赖

在2.3.0版本之前spring-boot-starter-web是集成了validation检验的;但是在2.3.0开始就去掉了该依赖,所以需要自己添加该依赖。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

@Validated分组校验

定义实体类

@Data
public class User { @NotBlank(groups = {UpdateGroup.class}, message = "id不能为空")
private String id; @NotBlank(groups = {SaveGroup.class, UpdateGroup.class}, message = "姓名不能为空")
private String name; @NotNull(message = "性别不能为空")
private String sex; @Max(value = 20 ,message = "最大长度为20")
private String address; @Email(message = "不满足邮箱格式")
private String email; @AssertTrue(message = "字段为true才能通过")
private boolean isAuth; @NotBlank(message = "手机号不能为空")
@Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手机号格式有误")
private String mobile; @Future(message = "时间在当前时间之后才可以通过")
private Date date; // 新增时校验,继承Default类表示会包含没有分组的校验
public interface SaveGroup extends Default {
}
// 修改时校验
public interface UpdateGroup extends Default {
} }

controller 接口中使用 @Validated(groups) 设置了 groups 属性。

只有配置 groups = User.SaveGroup.class 的效验注解才会生效。

没有设置 groups 属性,则所有效验注解都会生效。

@RestController(value = "/user")
public class UserController {
@Autowired
private UserService userService; /**
* 新增用户
* @param user
* @return
*/
@RequestMapping("/insert")
@ResponseBody
public User insert(@RequestBody @Validated(User.SaveGroup.class) User user){
return userService.insert(user);
} /**
* 修改用户
* @param user
* @return
*/
@RequestMapping("/update")
@ResponseBody
public boolean update(@RequestBody @Validated(User.UpdateGroup.class) User user){
return userService.update(user);
} }

对Controller里的方法的多个参数进行校验

对Controller里的方法的多个参数进行校验(扁平化参数):在Controller类上加注解@Validated

@RestController
@RequestMapping
@Validated
public class HelloController {
@PutMapping("/hello/id/{id}/status/{status}")
public Object helloGet(@Max(5) @PathVariable Integer id, @Min(5) @PathVariable Integer status) {
return "hello world";
}
}

@NotEmpty、@NotNull、@NotBlank的区别

  • @NotNull :不能为null,但可以为empty,没有Size的约束,带注释的元素不能为null。接受任何类型。一般用在Integer、Double等基本数据类型的非空校验上,使用** @size、@Max、@Min **对字段数值进行大小的控制。

  • @NotEmpty:不能为null,且Size>0,@NotEmpty注解的String、Collection、Map、数组是不能为null或长度为0

  • @NotBlank:只用于String,不能为null且trim()之后size>0,纯空格的String也是不符合规则的,此注解只能用于验证String类型

Spring注解之参数校验@Validated和@Valid的更多相关文章

  1. spring注解式参数校验

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...

  2. spring注解式参数校验列表

    校验注释列表: @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNu ...

  3. 转 spring注解式参数校验

    转自: https://blog.csdn.net/jinzhencs/article/details/51682830 转自: https://blog.csdn.net/zalan01408980 ...

  4. Spring基础系列-参数校验

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9953744.html Spring中使用参数校验 概述 ​ JSR 303中提出了Bea ...

  5. 参数验证 @Validated 和 @Valid 的区别

    来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验 ...

  6. 注解:@RequiredArgsConstructor、 @Validated、 @Valid、 @Lazy

    1. lombok注解:@RequiredArgsConstructor Spring 依赖注入方式 1.通过 @Autowire.@Resource 等注解注入, 2.通过构造器的方式进行依赖注入. ...

  7. 【spring】-- jsr303参数校验器

    一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...

  8. spring boot validation参数校验

    对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. Spring Boot自身对数据在服务端的校验有一个比较好的支持,它能将 ...

  9. Spring校验:@Validated和@Valid区别

    结论: Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated Spring Validation验证框架对参数的验证机制提供 ...

  10. @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

随机推荐

  1. ARM64: ARDP

    1 指令语法 ardp <Xd>, <lable> 2 指令语义 1 获取程序计数器PC寄存器的值: 2 将PC寄存器值的低12位全部取0; 3 将lable的值乘以4096, ...

  2. 使用.NET查询日出日落时间

    在WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题.那如何实现自动切换主题呢?通常有两种机制:一是跟随系统明暗主题切换,二是像手机操作系统那样根据日出日落时间自动 ...

  3. Ubuntu更新源文件报错:E: 仓库 “http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release” 没有 Release 文件。

    E: 仓库 "http://ppa.launchpad.net/chris-lea/node.js/ubuntu bionic Release" 没有 Release 文件. 一条 ...

  4. 我发现了字节OpenApi接口的bug!

    本文记录我在对接字节旗下产品火山云旗下云游戏产品 OpenApi 接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴). 1. ...

  5. 如何使用 JavaScript 获取当前页面帧率 FPS

    可以通过计算每秒 window.requestAnimationFrame 的调用频率来做为 FPS 值.它接收一个回调函数,该回调函数会在浏览器下一次重绘之前执行.所以只要我们循环调用并记录单位时间 ...

  6. 【asp.net】滑块验证码(分享一个从github上下载的源码)

    思路: 1. 准备好10张或20张不同规格的图片,按规格分类到不同文件夹,每个文件夹的图片从1开始顺序递增命名,为了随机选择图片.   2.前端提交规格比如200*300,根据规格选择原图,并初始化 ...

  7. MahApps.Metro的MVVM模式解析(二) 主题功能

    MahApps.Metro的MVVM模式解析(二) 主题功能 MahApps.Metro是一个开源的WPF框架,旨在为WPF应用程序提供现代和漂亮的用户界面. 在MahApps.Metro中提供了切换 ...

  8. Vue cli之项目打包

    在项目根目录中执行如下命令: npm run build 注:Vue脚手架打包的项目必须在服务器上运行,不能直接双击运行: 在打包之后项目中出现 dist 目录,dist 目录就是 Vue脚手架项目的 ...

  9. centos6 chkconfig的原理 和添加开机自启动的办法

    当我们使用 chkconfig --list的时候 都会又 123456 这样的级别. 当某个级别是 on 他就会开机启动,当他是off 的时候他就不会开机自启动. 那么这是什么原因呢?他的 原理是什 ...

  10. Opencv笔记(12)傅里叶变换

    在之前了解的OpenCV为我们实现的图像变换,这些本质上是从图像到输出图像的映射,即输入仍是一幅图像.本章的傅里叶变换,输出数组的值在含义上和原图像的强度值大不相同,是输入图像的频域表示. cv::d ...