文章目录

  • 介绍:
  • validation引入
  • 可用约束(constraint)
  • 应用实战
    • 实体类
    • 接口参数型
    • 约束生效
    • 实体型

介绍:

在开发中,会经常需要进行参数的校验,比如接口层、业务层、持久层等,其中接口的参数校验就是最为常见的。这里就来看一下springboot中参数校验(validation)的使用。

validation引入

在springboot官方文档上对validation的使用介绍中,说明了只要JSR-303实现(例如Hibernate验证器)在类路径上,Bean Validation 1.1支持的方法验证功能就会自动启用。为此springboot为我们提供了一个 validation starter:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><!--<version>2.1.0.RELEASE</version>-->
</dependency>

里面校验的核心依赖就是JSR-303标准的实现(Hibernate验证器):

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId>
</dependency>

这个不需要添加 已经包含在内了

如果我们在进行web开发的话,就不需要在引用“spring-boot-starter-validation”了,因为“spring-boot-starter-web”中已经引用了“hibernate-validator”。

可用约束(constraint)

hibernate-validator沿用了validation-api中的所有注解约束,同时也定义了一些自己的约束:

应用实战

约束应用

实体类

首先是使用约束性注解,在实体型参数上使用,代码样例如下:

/*** @author lazycece* @date 2019/02/15*/
@Setter
@Getter
@ToString
public class UserInfoReq {@NotNull(message = "id不能为null", groups = {Update.class})private Long id;@NotBlank(message = "username不能为空")private String username;@NotNull(message = "age不能为null")@Min(value = 1, message = "年龄不符合要求")@Max(value = 200, message = "年龄不符合要求")private Integer age;
}

接口参数型

在接口参数上使用,代码样例如下:

@GetMapping("/query")
public String queryUserInfo(@NotBlank(message = "username不能为空") String username) {log.info("查询用户成功: {}", username);return "success";
}

约束生效

要使我们添加的约束注解生效,那么还得使用另一个注解:@Validated 或者 @Valid(只针对实体性有用)。

实体型

要使得实体性参数生效,需要在接口参数上添加 @Validated 或者 @Valid 注解。代码样例如下:

@PutMapping("/add")
public String addUserInfo(@Validated UserInfoReq req) {log.info("添加用户成功: {}", req.toString());return "success";
}
@PostMapping("/update")
public String updateUserInfo(@Validated(value = {Update.class}) UserInfoReq req) {log.info("更新用户成功: {}", req.toString());return "success";
}

而最好使用@Validated,因为它可以使用验证组,使得某一个参数只针对属于该组的情况下验证生效,如实体参数中使用:

@NotNull(message = "id不能为null", groups = {Update.class})
private Long id;

然后生效注解上加上组:

@Validated(value = {Update.class})

这样即表示,参数id的验证只针对更新操作(update)生效,而在执行添加操作(add)的时候是不验证的。

接口参数型
要使得接口参数型的验证生效,是必须在里面加@Validated注解的。(此类型和实体性验证失败所产生的异常是不同的)

springboot中参数校验(validation)使用相关推荐

  1. jsr 正则验证_使用 Bean Validation 解决业务中参数校验

    痛点及现状 代码中常常见到如下代码: if (Objects.equal(0L ,repertory)){ return ApiResultMap.errorResult(-1 ,"操作数量 ...

  2. Java参数校验validation和validator区别

    Java参数校验validation和validator区别 1. 参数校验概述 2. validation与validator区别 3. validation注解说明 4. validator注解说 ...

  3. springboot参数校验validation

    文章目录 1. 引入 2. 基本使用 2.1 引入依赖 2.2 基本使用 2.3 注解介绍 2.4 返回值完善 2.5 统一异常处理 2.6 @Valid和@Validate注解 3. 分组校验 4. ...

  4. SpringBoot:参数校验的使用(validator)

    文章目录 SpringBoot参数校验的使用(validator) 一.validator简介 二.注解介绍 内置注解 扩展注解 三.validator的使用(手动校验) 创建校验工具类 对一个对象进 ...

  5. Springboot @Validated参数校验

    简单使用 Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现.hibernate validation是对这个规范的实现,并增加了校验注解如@Em ...

  6. 校验json格式_不来学一下SpringBoot统一参数校验?

    微服务架构之春招总结:SpringCloud.Docker.Dubbo与SpringBoot 一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官. 金三银四第一天,啃透这些Spr ...

  7. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  8. SpringBoot里参数校验/参数验证

    1.前言 在控制器类的方法里自己写校验逻辑代码当然也可以,只是代码比较丑陋,有点"low".业界有更好的处理方法,分别阐述如下. 2.PathVariable校验 @GetMapp ...

  9. SpringBoot的参数校验器 - Validator

    1.前提 在日常的开发中,服务端对象的校验是非常重要的一个环节,比如注册的时候:校验用户名,密码,身份证,邮箱等信息是否为空,以及格式是否正确. 但是这种在日常的开发中进行校验太繁琐了,代码繁琐而且很 ...

最新文章

  1. MFC SetWindowPos
  2. java 线程 插件_我的第一个Chrome插件:天气预报应用
  3. IntelliJ IDEA for Mac如何管理SDK/JDK,模块如何设置SDK/JDK?
  4. 《面向对象程序设计》课程作业二
  5. oracle 表空间 碎片,Oracle表空间碎片整理
  6. NumPy Beginner's Guide 2e 带注释源码 二、NumPy 基础入门
  7. cropbox php,jQuery用户头像裁剪插件cropbox.js使用详解
  8. 【网上商城】--图片保存位置分析
  9. android密度计算器,密度计算器
  10. python弹幕点歌_GitHub - smilecc/blive-raspberry: 完全重构的树莓派B站直播弹幕点播台...
  11. DSL是什么意思?Mbps是什么意思?
  12. spring终极宝典
  13. 图片放大缩小js工具
  14. 考研英语——长难句语法
  15. 自动驾驶汽车是如何利用高精度地图和高精度定位来进行“导航”的
  16. linux必看书籍推荐
  17. AutoHotKey方向键组合
  18. 【JS】AMD,CMD,CommenJS和ES6
  19. 买工业路由器看什么参数
  20. 基于 mPaaS 框架 Portal-Bundle 接入方式下 Multidex 分包失效的解决方法

热门文章

  1. C语言编程习惯和修养
  2. iOS 图片自由裁剪
  3. Fluent最全complied错误原因分析:Error: The UDF library you are trying to load (libudf) is not compiled for
  4. java ocr 表格票据识别_OCR表格票据识别技术。
  5. 《这才是马云》读书笔记
  6. MIPS递归:斐波那契数列
  7. maven clean、install命令
  8. A调用B方法,@Transactional事务问题
  9. JS实现邮箱提示补全效果
  10. 小开销实现工作日的一个方法