@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. three.js教程7-PBR材质与环境贴图CubeTextureLoader

    1.PBR材质 PBR是基于物理的渲染(physically-based rendering).模拟物体表面的反射算法. Three.js提供了两个PBR材质相关的类MeshStandardMater ...

  2. 欧洲对 Splashtop 远程计算机实验室的需求增长十倍

    ​2021 年 1 月 7 日,加利福尼亚州圣何塞 - 远程访问和远程支持解决方案的全球领导者 Splashtop Inc. 报告称其对用于教育的远程实验室访问软件的需求在欧洲激增,在 2020 年第 ...

  3. Paimon的写入流程

    基于Paimon 0.5版本 写入流程的构建org.apache.paimon.flink.sink.FlinkSinkBuilder#build 算子的流向 BucketingStreamParti ...

  4. 密码学—DES加密的IP置换Python程序

    文章目录 IP初始置换与逆置换 编程想法 转二进制过程中的提取一些数据 64为一组 IP置换 IP逆置换 DES发明人 美国IBM公司W. Tuchman 和 C. Meyer1971-1972年研制 ...

  5. next-元数据创建、更新 SEO 优化

    在创建Next.js项目时,根页面会自动生成一个metadata对象,其中包含标题和描述等关键信息.每当页面被访问时,这个metadata对象会被读取并应用到HTML的默认配置中,确保页面的基本信息得 ...

  6. 记一次asp.net 8 服务器爆满的解决过程

    1.描述一下服务器配置: 一台2c4g的centos,做api接口反代 一台8c16g的windows 2019 作为实际服务器,跑了iis,sql server,mongodb,redis 2.业务 ...

  7. nginx map模块使用和配置

    主机 IP 备注 master1 10.0.0.63 master2 10.0.0.64 1. NGINX MAP模块与NGINX GEO模块 在通常情况下,使用nginx基于 ip 限制访问请求频率 ...

  8. OpenCV笔记(7) 轮廓

    1. 查找轮廓 FindContours public static void FindContours(InputOutputArray image, //输入8-bit单通道的图片 out Mat ...

  9. k8s——istio

    安装istio Istio / 入门 [root@master ~]# curl -L https://istio.io/downloadIstio | sh - % Total % Received ...

  10. 使用Express写接口

    接口规范 随着前后端分离越来越普遍, 后端接口规范也就越来越重要了,一套良好的接口规范可以提升工作效率, 减少沟通障碍.通常我们都会采用RestfulApi方式来提供接口, 使用 JSON 来传输数据 ...