springboot @Valid注解参数校验
大约 4 分钟
一、为什么接口要校验参数
为什么我们开发接口时要校验参数呢?主要是从如下几个方面考虑:
数据完整性:参数校验可以确保接收到的数据完整且格式正确,避免因缺少必要参数或参数格式错误导致的数据异常或系统崩溃。
安全性:参数校验可以有效防范恶意输入攻击(如 SQL 注入、XSS 攻击等)。通过校验和过滤用户输入,可以降低系统受到攻击的风险。
业务逻辑正确性:参数校验有助于确保请求参数符合业务逻辑要求,避免因不合法参数导致的业务错误或异常情况。
提高代码质量:通过明确定义参数的校验规则,再处理数据时可以减少代码中的逻辑判断和错误处理。
用户体验:对参数进行校验可以在用户提交错误参数时及时给出反馈,知道哪些没填写及时修改。
减少异常情况:合理的参数校验可以减少系统运行时出现异常情况的可能性,提高系统稳定性和可靠性。
二、为什么使用 @Validated 来验证参数
开发中在写接口必定要增加请求参数合法性的校验,我们会常用也是最简单的做法,是大量的使用if else
来逐个对字段进行判断,如下:
@RestController
public class TestController {
@PostMapping("/user")
public String addUserInfo(@RequestBody User user) {
if(user.getUsername() == null || "".equals(user.getUsername())) {
......
} else {
......
}
......
}
}
从代码逻辑上来看这么写没有任何毛病,一旦参数较多就会存在大量的验证逻辑,从代码维护性、可读性角度看,是比较糟糕的代码。那么使用 @Validated
注解可以帮助我们简化验证逻辑、便于代码的维护。
三、@Validated 注解的作用
@Validated
注解的主要作用是用于数据效验,标注在定义的实体内属性上,添加不同的校验注解
来完成不同的校验规则,而在接口类中的接收数据参数中添加 @Validated
注解,此时你的API接口就实现了自动校验参数的能力。
实体类属性上常用的校验注解类型:
需要注意每个注解对应的数据类型
校验注解 | 描述 |
---|---|
空检查 | |
@Null | 限制只能为 null |
@NotNull | 限制必须不为 null |
@NotEmpty | 验证注解的元素值不为 null 且不为空(字符串长度不为 0、集合大小不为 0) |
@NotBlank | 验证注解的元素值不为空(不为 null、去除首位空格后长度为 0),只应用于字符串,在比较时会去除字符串的空格 |
Boolean 检查 | |
@AssertFalse | 限制必须为 false |
@AssertTrue | 限制必须为 true |
长度检查 | |
@Size | 限制字符串、数组、集合长度范围必须在 min 到 max 之间 |
@Length | 验证注解的元素值长度在 min 和 max 区间内,只能用于字符串 |
日期检查 | Date/Calendar |
@Past | 限制必须是一个过去的日期 |
@Future | 限制必须是一个将来的日期 |
@Pattern | 限制必须符合指定的正则表达式 |
数值检查 | 建议使用在 String, Integer 类型 |
@Min | 限制必须为一个不小于指定值的数字 |
@Max | 限制必须为一个不大于指定值的数字 |
@DecimalMin | 限制必须为一个不小于指定值的数字 |
@DecimalMax | 限制必须为一个不大于指定值的数字 |
@Digits | 验证是否为数字 |
@Digits | 限制必须为一个小数,且整数部分的位数不能超过 integer,小数部分的位数不能超过 fraction |
@Range | 检查数字是否在范围 min 到 max 之间 |
其他验证 | |
@Valid | 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验 |
用于验证一个字符串是否是一个合法的邮箱地址,空字符串或 null 算验证通过 | |
@URL | 用于校验一个字符串是否是合法 URL |
Github
本文 Github 案例地址
Gitee
本文 Gitee 案例地址