springboot的实体类字段校验的分组校验

news2025/3/11 0:54:45

分组校验(Group Validation)允许在不同的场景下对同一个实体类应用不同的校验规则。例如,在新增数据更新数据时,可能需要对某些字段的校验规则进行调整。以下是分组校验的具体实现步骤:


一、定义分组接口

创建空的标记接口(仅用于分组标识):

// 新增时的校验分组
public interface CreateGroup {}

// 更新时的校验分组
public interface UpdateGroup {}

二、在实体类中指定分组

在字段的校验注解中,通过 groups 属性指定所属分组:

public class User {
    
    @NotBlank(message = "用户ID不能为空", groups = UpdateGroup.class)
    private String id;

    @NotBlank(message = "用户名不能为空", groups = CreateGroup.class)
    private String username;

    @Size(min = 6, max = 20, message = "密码长度需在6到20位之间", groups = {CreateGroup.class, UpdateGroup.class})
    private String password;

    // 省略Getter和Setter
}
  • id 字段:仅在 UpdateGroup 分组下校验(更新时必须校验)。
  • username 字段:仅在 CreateGroup 分组下校验(新增时必须校验)。
  • password 字段:在 CreateGroupUpdateGroup 分组下均校验(新增和更新时都校验)。

三、在Controller中指定校验分组

在Controller方法参数上使用 @Validated 注解(注意是 Spring 的注解,而非 @Valid),并指定分组:

@RestController
public class UserController {

    // 新增用户(校验 CreateGroup 分组)
    @PostMapping("/users")
    public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {
        return "用户新增成功";
    }

    // 更新用户(校验 UpdateGroup 分组)
    @PutMapping("/users/{id}")
    public String updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {
        return "用户更新成功";
    }
}

四、全局异常处理

分组校验失败会抛出 ConstraintViolationException,需在全局异常处理器中捕获:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public Map<String, Object> handleConstraintViolationException(ConstraintViolationException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getConstraintViolations().forEach(violation -> {
            String field = violation.getPropertyPath().toString();
            String message = violation.getMessage();
            errors.put(field, message);
        });
        return Map.of(
            "code", HttpStatus.BAD_REQUEST.value(),
            "message", "参数校验失败",
            "data", errors
        );
    }
}

五、测试示例

1. 新增用户(触发 CreateGroup 分组校验)

请求:

POST /users
Content-Type: application/json

{
    "password": "12345"
}

响应:

{
    "code": 400,
    "message": "参数校验失败",
    "data": {
        "username": "用户名不能为空",
        "password": "密码长度需在6到20位之间"
    }
}
2. 更新用户(触发 UpdateGroup 分组校验)

请求:

PUT /users/123
Content-Type: application/json

{
    "password": "12345"
}

响应:

{
    "code": 400,
    "message": "参数校验失败",
    "data": {
        "id": "用户ID不能为空",
        "password": "密码长度需在6到20位之间"
    }
}

六、分组校验的高级用法

1. 多分组组合校验

可以在 @Validated 中同时指定多个分组:

@Validated({CreateGroup.class, AnotherGroup.class})
2. 默认分组

如果字段未指定 groups 属性,则默认属于 Default 分组。可以通过 @Validatedvalue 属性同时包含默认分组:

@Validated(value = {UpdateGroup.class, Default.class})
3. 继承分组

分组接口可以继承其他接口,形成层级关系:

public interface AdvancedGroup extends CreateGroup {}

七、分组校验 vs 多个DTO

方案优点缺点
分组校验避免创建多个相似DTO,减少冗余代码实体类可能包含不同场景的注解
多个DTO职责单一,结构清晰需要维护多个DTO类

总结

通过分组校验,可以灵活控制不同场景下的校验规则,避免为每个场景创建单独的DTO类。关键步骤:

  1. 定义分组接口。
  2. 在实体类字段的校验注解中指定 groups
  3. 在Controller方法参数上使用 @Validated(分组.class)
  4. 全局捕获 ConstraintViolationException 并返回自定义错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP8266UDP透传

1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 响应 : OK 2. PC 连⼊入 ESP8266 softAP 就是连接wifi 3.查询ESP8266设备的IP地址 ATCIFSR 响应: CIFSR: APIP, "192.168.4.1" CIFSR: APMAC, "1a: fe: 34: a5:8d: c6" CIFSR: STAIP, "192.…

UE5从入门到精通之如何创建自定义插件

前言 Unreal 的Plugins插件系统中有很多的插件供大家使用,包括官方的和第三方的,这些插件不仅能帮我我们实现特定功能,还能够提升我们的工作效率。 所以我们今天就来自己创建一个自定义插件,如果我们想实现什么特定的功能,我们也可以发布到商店供大家使用了。 创建插件 …

基于python大数据的招聘数据可视化与推荐系统

博主介绍&#xff1a;资深开发工程师&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

Spring Boot使用JDBC /JPA访问达梦数据库

Spring Boot 是一个广泛使用的 Java 框架&#xff0c;用于快速构建基于 Spring 的应用程序。对于达梦数据库&#xff08;DMDB&#xff09;的支持&#xff0c;Spring Boot 本身并没有直接内置对达梦数据库的集成&#xff0c;但你可以通过一些配置和依赖来支持达梦数据库。 以下…

【五.LangChain技术与应用】【31.LangChain ReAct Agent:反应式智能代理的实现】

一、ReAct Agent是啥?为什么说它比「普通AI」聪明? 想象一下,你让ChatGPT查快递物流,它可能直接编个假单号糊弄你。但换成ReAct Agent,它会先推理(Reasoning)需要调用哪个接口,再行动(Action)查询真实数据——这就是ReAct的核心:让AI学会「动脑子」再动手。 举个真…

OpenText ETX 助力欧洲之翼航空公司远程工作升级

欧洲之翼航空公司&#xff0c;作为欧洲知名的低成本航空公司&#xff0c;拥有超过 130 架飞机&#xff0c;服务于约 60 个国家的 210 多个目的地&#xff0c;是欧洲第三大的点对点航空公司。面对 2020年 冠状病毒大流行的挑战&#xff0c;欧洲之翼航空公司迅速采取行动&#xf…

特征表示深度解析:颜色、纹理、形状与编码

第一部分&#xff1a;颜色与纹理特征&#xff08;Part 1&#xff09; 1. 颜色特征 颜色直方图&#xff08;Color Histogram&#xff09; 定义&#xff1a;统计图像中各颜色通道&#xff08;R/G/B&#xff09;的像素分布&#xff0c;形成直方图。 计算步骤&#xff1a; 将每个…

LeetCode Hot100刷题——反转链表(迭代+递归)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…

MCU-缓存Cache与CPU中的主存SRAM

缓存&#xff08;Cache&#xff09;和主存&#xff08;SRAM&#xff09;均属于 ​SRAM&#xff0c;他们的核心区别&#xff1a; 通过 Cache 缓存 Flash 中的指令和数据&#xff0c;可避免 CPU 因等待数据而停滞。主存 SRAM 存储程序运行时的变量、堆栈、临时数据等。通常作为 …

在Windows 11的WSL中安装Kali Linux

Kali Linux 是网络安全从业者和爱好者的首选工具集&#xff0c;但直接在物理机或虚拟机上运行可能占用较多资源。借助 Windows Subsystem for Linux (WSL)&#xff0c;我们可以在Windows 11中原生运行Kali Linux&#xff0c;轻量且高效。本教程将手把手教你如何在WSL2中安装并配…

Manus AI Agent 技术解读:架构、机制与竞品对比

目录 1. Manus 是什么&#xff1f; 1.1 研发背景 1.2 技术特点 1.3 工具调用能力 1.4 主要应用场景 2. Manus 一夜爆火的原因何在&#xff1f; 2.1 技术突破带来的震撼 2.2 完整交付的产品体验 2.3 生态与开源策略 3. Manus 与其他 AI Agent 的对比分析 3.1 技术架构…

010---基于Verilog HDL的分频器设计

文章目录 摘要一、时序图二、程序设计2.1 rtl2.2 tb 三、仿真分析四、实用性 摘要 文章为学习记录。绘制时序图&#xff0c;编码。通过修改分频值参数&#xff0c;实现任意整数分频器设计。 一、时序图 二、程序设计 2.1 rtl module divider #(parameter DIV_VALUE 5) (…

Python贝壳网二手小区数据爬取(2025年3月更)

文章目录 一、代码整体架构解析二、各部分代码详解1. main()主函数解析2. 会话初始化&#xff08;伪装浏览器身份&#xff09;3. 动态参数生成&#xff08;反爬虫核心机制&#xff09;4. 列表页抓取&#xff08;获取小区列表&#xff09;5. 列表页解析&#xff08;提取小区信息…

基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Dify使用日常:我是如何按标题级别将word中的内容转存到excel中的

先上效果图 word中的内容 转存到excel之后 实现步骤&#xff1a; 1、在dify中创建一个工作流&#xff0c;如上图 2、在开始节点增加一个支持文件上传的变量 3、添加文档提取器&#xff0c;提取上传的文件中的内容 4、添加大模型节点&#xff0c;将文档提取器提取出来的内容&…

元脑服务器:浪潮信息引领AI基础设施的创新与发展

根据国际著名研究机构GlobalData于2月19日发布的最新报告&#xff0c;浪潮信息在全球数据中心领域的竞争力评估中表现出色&#xff0c;凭借其在算力算法、开放加速计算和液冷技术等方面的创新&#xff0c;获得了“Leader”评级。在创新、增长力与稳健性两个主要维度上&#xff…

Linux一键美化命令行,一键安装zsh终端插件

zsh应该是很多人第一个用的Linux终端美化软件 但是其安装略微复杂&#xff0c;让人有些困扰 所以我花了两天写了一键安装脚本&#xff0c;实测运行后直接安装好 适用于Ubuntu、Debian、Red Hat、macOS等系统 直接安装好zsh 以及常用插件 autojump 跳转插件 zsh-syntax-highlig…

实验一:在Windows 10/11下配置和管理TCP/IP

目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境&#xff1a;每人一台计算机&a…

【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…