数据校验-springboot

news2024/10/7 15:29:05

前置知识

先了解一下JSR、Hibernate Validator、Spring Validation

  • JSR(Java Specification Request)规范是Java EE 6中的一项子规范,也叫作Bean Validation。它指定了一整套基于bean的验证API,通过标注给对象属性添加约束条件
  • Hibernate Validator是对JSR规范的实现,并增加了一些其他校验注解,如@Email、@Length、@Range等。
  • Spring Validation是Spring为了给开发者提供便捷,对Hibernate Validator进行了二次封装。

JSR定义了数据验证规范,而Hibernate Validator则是基于JSR规范,实现了各种数据验证的注解以及一些附加的约束注解。Spring Validation则是对Hibernate Validator的封装整合。

Spring Boot是从Spring发展而来的,所以自然支持Hibernate Validator和Spring Validation两种方式,默认使用的是Hibernate Validator组件。


案例

post请求参数较多时,可以在对应的数据模型(Java Bean)中进行数据校验,通过注解来指定字段校验的规则。

1、添加依赖

添加如下maven依赖:

<!--        参数校验-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、定义数据模型

定义一个接收数据的数据模型(javabean),使用注解的形式描述字段校验的规则。下面以PostTag_form对象为例:

/**
 * <p>
 * 接收前端提交的表单数据
 * </p>
 *
 * @author 轻率的保罗
 * @since 2022-12-17
 */
@Getter
@Setter
@Accessors(chain = true)
@ApiModel(value = "标签form对象", description = "前端提交的表单数据")
public class PostTag_form implements Serializable {

    @ApiModelProperty(value = "标签名",required = true)
    @NotBlank(message = "标签名称不能为空!")
    @Length(max = 20,message = "标签名称长度不合法,应大于0、小于等于20!")
    private String tagName;

    @ApiModelProperty(value = "创建者ID",required = true)
//  @NotBlank(message = "创建者ID不能为空!")
    @Length(min = 5,max = 25,message = "创建者ID长度不合法,应大于等于5、小于等于25!")//包含了 @NotBlank 的情况
    private String userId;

}

注解@NotBlank,表示该字段必填(该字符串不能为空)。

注解中的属性message是数据校验不通过时要给出的提示信息。

3、应用

在controller中应用:

post请求中,@RequestBody PostTag_form form接收前端所提交的数据。在@RequestBody注解后面添加了@Valid注解,然后在后面添加了BindingResult返回验证结果,BindingResult是验证不通过时的结果集合。

@ApiOperation(value = "新增标签",notes = "创建成功,则返回新创建标签的ID")
@PostMapping
public DataVo addTag(@RequestBody @Valid PostTag_form form, BindingResult result){
    //参数校验
    if(result.hasErrors()) {
        return JSONResult.errorMap(result);
    }
    //参数校验通过,再调用service的addTag方法处理请求
    return tagService.addTag(form);
}

注意,BindingResult必须跟在被校验参数之后,若被校验参数之后没有BindingResult对象,则会抛出BindException。

方法 JSONResult.errorMap(BindingResult result) 如下:

/**
 * 异常 代码501
 * 参数异常,map中放具体的异常参数(key/value)。例如 email = 邮箱格式不正确!
 * @param result springboot参数校验(validation),返回BindingResult对象。
 */
public static DataVo errorMap(BindingResult result) {
    HashMap<String, String>  errMap = new HashMap<>(result.getFieldErrors().size());
    for (FieldError error : result.getFieldErrors()) {
        //示例: "tagName": "不能为空"
        //error.getCode() 可获取校验不通过的注解,即@NotBlank 还是 @Length
        errMap.put(error.getField(),error.getDefaultMessage());
    }
    return new DataVo(501, "参数异常!详情见data!", errMap);
}

4、测试

4.1提交空数据

请求参数如下:

{
  "tagName": "",//长度0
  "userId": ""//长度0
}

响应内容:

{
  "code": 501,
  "msg": "参数异常!详情见data!",
  "data": {
    "tagName": "标签名称不能为空!",
    "userId": "创建者ID长度不合法,应大于等于5、小于等于25!"
  }
}

4.2提交错误数据(超长度)

请求参数如下:

{
  "tagName": "123451234512345123451",//长度21
  "userId": "1234"//长度4
}

响应内容:

{
  "code": 501,
  "msg": "参数异常!详情见data!",
  "data": {
    "tagName": "标签名称长度不合法,应大于0、小于等于20!",
    "userId": "创建者ID长度不合法,应大于等于5、小于等于25!"
  }
}

常用注解

所有的注解都包含code和message这两个属性(见前边的代码result.getFieldErrors())。Message定义数据校验不通过时的错误提示信息。code定义错误的类型。


扩展

@NotNull、@NotEmpty、@NotBlank区别:

  • 1、@NotNull

    • 不能为 null,但可以为 empty,**一般用在 int、long、double、BigDecimal等数值类型 **的非空校验上,而且被其标注的字段可以使用 @size、@Max、@Min 对字段数值进行大小的控制
    • @Range 一般用在 数值 类型上可对字段数值进行大小范围的控制。
  • 2、@NotEmpty

    • 不能为 null,且长度必须大于 0,一般用在 集合 类上或者 数组 上
  • 3、@NotBlank

    • 只能作用在接收的 String 类型上,不能为 null,而且调用 trim() 后,长度必须大于 0即:必须有实际字符
    • @Length 一般用在 String 类型上可对字段数值进行最大长度限制的控制。

案例2

public class User {
        @NotBlank(message = "姓名不允许为空!")
        @Length(min = 2,max = 10,message = "姓名长度错误,姓名长度2-10!")
        private String name;

        @NotNull(message = "年龄不能为空!")
        @Min(18)
        private int age;

        @NotBlank(message = "地址不能为空!")
        private String address;

        @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
        private String phone;
    @Email(message = "邮箱格式错误")
        private String email;

        // 省略get和set方法
}

说明

本博客中的案例,使用的maven依赖如下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--        启用web支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--        参数校验-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<!--        启用lombok(lombok 与 日志@Slf4j)-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<!--        启用单元测试-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>


笔记摘自:CSDN-故屿γ、《Spring Boot从入门到实战》-章为忠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化之中国足球队在国际足联及亚洲的历史排名看这儿

最近最热的体育盛事莫过于世界杯了&#xff0c;四年一届的足球盛事&#xff0c;正在卡塔尔激战正酣。这时候可能会有球迷疑问&#xff1a;怎么没看到中国队呢&#xff1f;也有网友调侃说中国队被分到工程队去了。 泱泱大国&#xff0c;难道中国十几亿人口&#xff0c;一个足球队…

【Javassist】快速入门系列02 使用Javassist实现方法执行时间统计

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 前言 上一章我们介绍了使用Javassist实现一个简单的Hello World程序&#xff0c;学会了Javassist创建类和新增方法。本章主要介绍如何使用Javassist实现一个无侵入的方法执行时间统计 …

DCN神州数码——DHCP相关操作指令(超详细)

DHCP服务器配置 service dhcp 启动DHCP 服务器或中继功能 ip dhcp pool pool1 network-address 1.1.1.1 24 default-router dns-server 8.8.8.8 domain-name dcn.com netbios-name-server 2.2.2.2 lease 5 ip dhcp excluded-address 2.2.2.2 创建DHCP地址池pool1配置地…

PHP反序列化详解(一)——反序列化基础

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是PHP反序列化详解&#xff08;一&#xff09;——反序列化基础。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#x…

西藏旅行网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; (1)旅游线路信息发布以及预定功能&#xff1a;顾客可通网站查看相应的旅游线路信息 和预定旅游线路功能&#xff0c;管理…

OpenCV(8)-OpenCV中的形态学

OpenCV中的形态学 形态学概述 什么是形态学处理&#xff1a; 基于图像形态进行处理的一些基本方法 这些处理方法基本上是对二进制图像进行处理卷积核决定这图像处理后的效果基本方法&#xff1a; 腐蚀与膨胀开运算闭运算顶帽黑帽 图像二值化 将图像的每个像素变成两种值&a…

服务器设置tomcat开机自启动(cmd命令行语句)

1 找到tomcat安装目录&#xff0c;进入bin/文件夹下面&#xff0c;在此打开windows 命令行窗口。 2 输入 service install tomcatXXX将tomcat注册成为windows服务&#xff0c;其中tomcatXXX为服务名。 3查看刚刚注册的服务 “我的电脑”-》右键管理 发现刚刚的服务是手动的&…

DevOps-6:Jenkins使用技巧

1、如何提升Jenkins的Job并行构建数 默认情况下&#xff0c;Jenkins只配置了2个Executor&#xff0c;即只允许最多2个Job同时构建&#xff0c;这个值可以修改&#xff1a; 在Manage Jenkins>Configure System里&#xff0c;找到 # of executors&#xff0c;修改这个值就好&…

DW学生美食网页设计作业——餐饮美食汉堡企业网站6页面带轮播(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

cython混淆加密

python代码是一种解释型的语言&#xff0c;有了代码和环境就可以执行&#xff0c;它无需编译。如果需要对代码进行混淆&#xff0c;可以借助cython这个库。它的安装很简单&#xff0c;直接运行pip install cython就可以安装。 进行代码混淆之前&#xff0c;还需要一个环境&…

windows下编译libevent源码

《Linux下编译libevent源码》讲述了linux下编译libevent源码的方法&#xff0c;本文讲述其在windows平台的编译。 一、下载libevent源码 https://libevent.org/ 下载libevent源码并解压。 二.安装依赖项 下载安装OpenSSL。https://slproweb.com/products/Win32OpenSSL.html 三…

MySQL8.0高级篇(下)-事务与日志和备份

文章目录一、事务基础知识1、数据库事务概述1.1 基本概念1.2 事物的ACID特性1.3 事务的状态2、如何使用事务2.1 显式事务2.2 隐式事务2.3 隐式提交数据的情况2.4 使用举例3、事务隔离级别3.1 数据准备3.2 数据并发问题3.3 SQL中的四种隔离级别3.4 MySQL支持的四种隔离级别4、事…

【实时数仓】DWM层订单宽表之需求分析、订单和订单明细关联源码

文章目录一 DWM层-订单宽表1 需求分析与思路2 订单和订单明细关联代码实现&#xff08;1&#xff09;从Kafka的dwd层接收订单和订单明细数据a 创建订单实体类b 创建订单明细实体类c 在dwm包下创建OrderWideApp读取订单和订单明细数据d 测试&#xff08;2&#xff09;订单和订单…

SpringBoot中的starter:whywhatmake

1、为什么用starter 我们知道&#xff0c;springboot框架是为了简化spring框架开发推出的&#xff0c;那么&#xff0c;在之前的spring框架开发中&#xff0c;如果我们需要连接数据库&#xff0c;引入mybatis框架&#xff0c;需要怎么操作呢&#xff1f;我们需要去maven仓库找…

当 chatGPT 被职场 PUA ,笑麻了

大家最近是不是被 chatGPT 刷屏了&#xff1f;简单来说&#xff0c;chatGPT 是一个智能聊天引擎。 那 chatGPT 和小爱同学、 siri 有什么区别呢&#xff1f; 如果体验过的朋友&#xff0c;能感受到区别还是很大&#xff0c;chatGPT 的智能表现过于优秀&#xff0c;远远超过了这…

深入浅出DPDK KNI核心技术

一、KNI KNI全称&#xff1a;Kernel NIC Interface&#xff0c;内核网卡接口&#xff0c;允许用户态程序访问linux控制平面。 在DPDK报文处理中&#xff0c;有些报文需要发送到内核协议栈进行处理&#xff0c;如GTP-C控制报文 如果报文数量较少&#xff0c;可以使用内核提供…

Lua热更新

Lua热更新解决方案 文章目录Lua热更新解决方案1.AB包1.1 AB包概述1. 从0开始的Lua语法1.1 HelloWorld1.2 数据类型1.3 字符串1.4 运算符1.5 条件语句1.6 循环语句1.7 函数1.8 数组1.9 迭代器1.10 字典&#xff0c;类&#xff0c;对象1.11 多脚本执行1.12 特殊语法1.13 协程1.14…

hive时间和字符串互转,时间函数

hive里经常需要将字符串转化为date或timestamp 或者转化为日期格式的string 先说一个简单的 cast(xx as date/string/timestamp) 这个大多情况都可以用 1.to_date to_date只保留年月日,参数必须是string类型的yyyy-MM-dd HH:mm:ss或者date或timestamp类型,返回值是date类型,…

尚太科技开启招股:预计募资总额22亿元,业绩增长迅猛

12月19日&#xff0c;石家庄尚太科技股份有限公司&#xff08;下称“尚太科技”&#xff0c;SZ:001301&#xff09;开启招股&#xff0c;将在深圳证券交易所主板上市。本次冲刺上市&#xff0c;尚太科技的发行价格为33.88元/股&#xff0c;发行数量为6494.37万股&#xff0c;募…

MySQL Binlog温故知新

目录 一、什么是Binlog 二、Binlog文件记录模式 三、Binlog 日志内容 四、常用的binlog日志操作命令 五、binlog日志中间件 一、什么是Binlog Binlog &#xff08;Binary log&#xff09;是MySQL的二进制日志&#xff0c;以二进制的形式记录了对于数据库的变更&#xff0…