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 提供的扩展注解)来代替。

相关推荐
王中阳Go8 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
码事漫谈9 小时前
消除AI幻觉,普通人能做的五件事
后端
程序员塔塔喵10 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
paopaokaka_luck10 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵11 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
Mk5987812 小时前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
后端
付威202312 小时前
从 Loop 到 Runtime:rpi Agent Loop 与 Cordis 的边界、取舍与组合
后端
IT_陈寒12 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
paopaokaka_luck13 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280413 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis