实战演练:如何在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"
}
相关推荐
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
码兄科技2 天前
24小时自助健身房系统软件开发实战指南:功能设计与部署方案
java·spring boot·uni-app
paopaokaka_luck2 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
需要8262 天前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
凤山老林2 天前
Spring Boot 应用 JVM 性能调优实战:GC 日志分析、堆内存规划与容器环境避坑
jvm·spring boot·gc·堆内存
计算机毕设定制辅导-无忧学长2 天前
《基于Vue的流浪动物救助中心管理系统的设计与实现》
java·vue.js·spring boot·流浪动物救助中心管理系统
huaweichenai2 天前
spring boot操作PDF
java·spring boot·pdf
guo_wen_qiang2 天前
springboot如何自定义一个启动器starter
java·spring boot·intellij-idea