Spring Boot Validation 声明式参数校验

文章目录


前言

Spring Boot Validation 是一套基于 Jakarta Bean Validation(原 JSR 303/380)规范的数据校验框架。它的核心作用就是帮你自动检查接口传入的参数是否合法,避免你在业务代码里写一堆 if (xxx == null) { return "参数错误"; } 这样的重复代码。

基本使用

在实体类字段上加注解(定义规则)在接收参数的 Java Bean 里,用注解声明每个字段的约束条件。

java 复制代码
public class UserDTO {
    @NotNull(message = "用户ID不能为空")
    private Long id;

    @NotBlank(message = "用户名不能为空")
    @Size(min = 2, max = 10, message = "用户名长度必须在2-10之间")
    private String name;

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

在 Controller 接口参数上加 @Valid(触发校验),在接收参数的位置标记 @Valid,Spring 就会在校验失败时自动抛出异常。

java 复制代码
@PostMapping("/user")
public R addUser(@Valid @RequestBody UserDTO user) {
    // 如果校验不通过,根本不会执行到这行代码
    return R.ok();
}

常见校验注解

注解 作用
@NotNull 不能为 null(任何类型)
@NotBlank 不能为 null,且去除空格后长度必须大于0(专用于字符串)
@NotEmpty 不能为 null,且集合/数组/字符串长度必须大于0
@Size(min, max) 限制长度范围(字符串、集合、数组)
@Min / @Max 限制数字大小
@Email 检查是否符合邮箱格式
@Pattern(regexp) 用正则表达式校验

分组校验

有时候,同一个实体类在新增和修改时的校验规则不一样(比如新增时 ID 必须为空,修改时 ID 必须不为空)。这时可以用分组(Groups):

java 复制代码
// 定义两个空接口作为分组标识
public interface AddGroup {}
public interface UpdateGroup {}

// 实体类里指定分组
public class UserDTO {
    @NotNull(message = "ID不能为空", groups = {UpdateGroup.class})
    @Null(message = "ID必须为空", groups = {AddGroup.class})
    private Long id;
}

// 接口使用时指定分组
@PostMapping("/add")
public R add(@Validated(AddGroup.class) @RequestBody UserDTO user) { ... }

@PutMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody UserDTO user) { ... }

注意:普通 @Valid 不支持分组,要用 @Validated(Spring 提供的扩展注解)来代替。

相关推荐
卷无止境2 小时前
智能体开发环境ADE浅析,编程工具的下一次范式跃迁
后端·python
码事漫谈5 小时前
DeepSeek 这波操作很凶
后端
Bs_MoneyMagnet6 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
子兮曰7 小时前
Bun v1.4.1 深度解析:从 Zig 到 Rust,一场 11 天、64 个 AI 代理的语言迁徙
前端·后端·bun
loser.with.m8 小时前
【AgentScope 2.0】05-从数据库配置到可运行 Agent:十个 Builder 开关怎么把一行 JSON 变成 HarnessAgent
人工智能·spring boot·ai
服务端相声演员9 小时前
in子查询的执行可能被优化为连接查询
mysql
IT_陈寒9 小时前
Vue的computed属性竟然坑了我一把
前端·人工智能·后端
行百里er9 小时前
Spring Insight 里收到的 Span 是怎么存下来的
spring boot·spring·监控
薛定谔的悦10 小时前
一套储能 BMS 的充电电流限值,是怎么一步步算出来的
后端
逐米时代10 小时前
AR加知识库提升一次修复率
后端·restful