实战演练:如何在Spring Boot项目中优雅地使用参数校验

✅ 空值 / 存在性校验

注解 一句话场景 示例
@NotNull 值不能为 null(可以是空串、空集合) Long userId; // 数据库必传主键
@NotEmpty 字符串/集合/数组 必须有 ≥1 个元素 List<String> tags; // 至少选一个标签
@NotBlank 字符串去掉前后空格后长度 >0 String username; // 用户名不能全空格

📏 长度 / 大小校验

注解 一句话场景 示例
@Size(min=,max=) 字符串、集合、数组长度区间 String nickname; // 2~16 个字符
@Length(min=,max=)(Hibernate 扩展) 专对字符串做字符级校验 String idCard; // 18 位身份证
@Min/@Max 数字下限 / 上限 int age; // 1~120
@DecimalMin/@DecimalMax 支持 BigDecimal 及字符串形式 BigDecimal price; // ≥0.01
@Positive / @PositiveOrZero 严格正数 / 非负数 int stock;
@Negative / @NegativeOrZero 严格负数 / 非正数 BigDecimal discount;

📧 格式 / 正则校验

注解 一句话场景 示例
@Email 宽松 Email 格式 String email;
@Pattern(regexp="") 自定义正则 String phone; // 国内 11 位手机号
@URL 合法 http/https 地址 String homepage;

🔐 布尔 / 时间 / 容器专用

注解 一句话场景 示例
@AssertTrue 必须为 true(常用于协议勾选) boolean acceptTerms;
@AssertFalse 必须为 false boolean isDeleted; // 逻辑删除字段
@Past / @PastOrPresent 必须是过去 / 过去或现在 Date birthday;
@Future / @FutureOrPresent 必须是将来 / 将来或现在 Date deliveryDate;
@Digits(integer=,fraction=) 最大整数位 & 小数位 BigDecimal fee; // 最多 5 位整数 2 位小数

🆔 Hibernate-Extra(最常用 4 个)

注解 一句话场景 示例
@Range(min=,max=) 数字/字符串长度一站式区间 int verifyCode; // 1000~9999
@UniqueElements 集合内元素不可重复 List<Long> roleIds;
@CreditCardNumber 通过 Luhn 校验的信用卡号 String cardNo;
@UUID 必须是 UUID 格式 String orderUuid;

🌰 完整 Demo(Spring Boot 2.7+)

java 复制代码
@RestController
@RequestMapping("/user")
@Validated   // ① 别忘了在类上加
public class UserController {

    @PostMapping("/register")
    public String register(@Valid @RequestBody RegisterCmd cmd) {
        return "OK";
    }
}

@Data
public class RegisterCmd {

    @NotBlank(message = "用户名不能为空")
    @Length(min = 3, max = 16, message = "用户名 3~16 位")
    private String username;

    @Email(message = "邮箱格式不正确")
    @NotBlank
    private String email;

    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
    private String phone;

    @Min(18) @Max(60)
    private Integer age;

    @NotEmpty
    @Size(max = 3, message = "最多选 3 个标签")
    private List<@UniqueElements String> tags;

    @AssertTrue(message = "必须同意用户协议")
    private boolean accept;
    /**
     * 目标
     */
    @NotNull(message = "目标不能为空")
    @DecimalMax(value = "99999999.99", message = "月目标不能大于99999999.99")
    @Digits(integer = 8, fraction = 2, message = "月目标整数部分最多8位,小数部分最多2位")
    private BigDecimal target;
}

启动后,如果参数非法,Spring 会自动返回:

java 复制代码
{
  "timestamp": "2025-12-12T08:30:00",
  "status": 400,
  "error": "Bad Request",
  "message": "用户名 3~16 位",
  "path": "/user/register"
}
相关推荐
期待のcode5 小时前
springboot热部署
java·spring boot·后端
Somehow0076 小时前
Spring Boot 集成 ElasticSearch 的简单示例
spring boot·设计
vx_bisheyuange6 小时前
基于SpringBoot的老年一站式服务平台
java·spring boot·后端·毕业设计
计算机毕设VX:Fegn08957 小时前
计算机毕业设计|基于Java + vue水果商城系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·课程设计
老华带你飞8 小时前
校务管理|基于springboot 校务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
JosieBook8 小时前
【部署】Spring Boot + Vue框架项目生产环境部署完整方案
vue.js·spring boot·后端
油丶酸萝卜别吃8 小时前
springboot项目中与接口文档有关的注解
java·spring boot·后端
小码哥0689 小时前
家政服务管理-家政服务管理平台-家政服务管理平台源码-家政服务管理平台java代码-基于springboot的家政服务管理平台
java·开发语言·spring boot·家政服务·家政服务平台·家政服务系统·家政服务管理平台源码
Java爱好狂.9 小时前
复杂知识简单学!Springboot加载配置文件源码分析
java·spring boot·后端·spring·java面试·后端开发·java程序员