跳至主要內容

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递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email用于验证一个字符串是否是一个合法的邮箱地址,空字符串或 null 算验证通过
@URL用于校验一个字符串是否是合法 URL
Github

本文 Github 案例地址
Gitee

本文 Gitee 案例地址
上次编辑于: