SpringBoot实战:接口参数校验与优雅处理
接口参数校验是后端开发的第一道防线。与其在业务代码中写满if (name null)不如使用 Spring Boot 提供的参数校验机制让代码更简洁、逻辑更清晰。一、 为什么需要参数校验在早期的开发中我们经常在 Service 层写大量的防御性代码publicvoidcreateUser(UserDTOdto){if(StringUtils.isEmpty(dto.getName())){thrownewIllegalArgumentException(用户名不能为空);}if(dto.getAge()null||dto.getAge()0){thrownewIllegalArgumentException(年龄必须为正数);}if(!dto.getEmail().matches(^[\\w-\\.]([\\w-]\\.)[\\w-]{2,4}$)){thrownewIllegalArgumentException(邮箱格式不正确);}// ... 业务逻辑}这种方式的缺点显而易见代码臃肿校验逻辑与业务逻辑混杂难以阅读。维护困难一旦校验规则变更需要修改多处代码。复用性差同样的 DTO 在不同接口中可能需要不同的校验规则。Spring Boot 整合了 Hibernate Validator实现了 Bean Validation 规范为我们提供了声明式的参数校验方案。二、 快速上手1. 引入依赖在 Spring Boot 2.3.x 之前spring-boot-starter-web已经包含了 validation 依赖。但在Spring Boot 2.3.x 及之后需要显式引入dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency2. 定义 DTO 并添加注解我们在 DTOData Transfer Object的字段上直接添加校验注解DatapublicclassUserDTO{NotBlank(message用户名不能为空)Size(min2,max20,message用户名长度必须在 2-20 之间)privateStringusername;NotNull(message年龄不能为空)Min(value0,message年龄必须大于等于 0)Max(value150,message年龄必须小于等于 150)privateIntegerage;Email(message邮箱格式不正确)privateStringemail;}3. Controller 层开启校验在 Controller 的方法参数前添加Valid或Validated注解RestControllerRequestMapping(/user)publicclassUserController{PostMappingpublicResultVoidcreateUser(ValidRequestBodyUserDTOuserDTO){// 如果参数校验失败程序不会进入这里而是抛出 MethodArgumentNotValidExceptionuserService.createUser(userDTO);returnResult.success();}}三、 进阶用法1.ValidvsValidatedValid: 属于 JSR-303 标准支持嵌套校验即如果一个对象内部包含另一个对象内部对象的注解也会被校验。Validated: 是 Spring 提供的注解功能更强大支持分组校验但默认不支持嵌套校验需要配合Valid使用。通常在 Controller 参数上使用Validated在 DTO 内部嵌套对象上使用Valid。2. 自定义校验注解当内置注解无法满足需求时例如校验手机号我们可以自定义注解。Step 1: 定义注解Target({ElementType.FIELD,ElementType.PARAMETER})Retention(RetentionPolicy.RUNTIME)DocumentedConstraint(validatedByPhoneValidator.class)// 指定校验器publicinterfacePhone{Stringmessage()default手机号格式不正确;Class?[]groups()default{};Class?extendsPayload[]payload()default{};}Step 2: 实现校验器publicclassPhoneValidatorimplementsConstraintValidatorPhone,String{privatestaticfinalStringPHONE_REGEX^1[3-9]\\d{9}$;OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){if(StringUtils.isEmpty(value)){returntrue;// 是否为空由 NotBlank/NotNull 控制这里只校验格式}returnvalue.matches(PHONE_REGEX);}}Step 3: 使用DatapublicclassUserDTO{// ... 其他字段Phone(message请输入有效的手机号码)privateStringphone;}3. 分组校验 (Validation Groups)同一个 DTO 在“创建”和“更新”场景下校验规则可能不同。例如创建时id应该为空更新时id必须有值。定义分组接口publicinterfaceCreateGroup{}publicinterfaceUpdateGroup{}配置 DTO 分组DatapublicclassUserDTO{Null(message创建用户时 ID 必须为空,groupsCreateGroup.class)NotNull(message更新用户时 ID 不能为空,groupsUpdateGroup.class)privateLongid;NotBlank(message用户名不能为空,groups{CreateGroup.class,UpdateGroup.class})privateStringusername;}Controller 中指定分组PostMappingpublicResultVoidcreateUser(Validated(CreateGroup.class)RequestBodyUserDTOuserDTO){// ...}PutMappingpublicResultVoidupdateUser(Validated(UpdateGroup.class)RequestBodyUserDTOuserDTO){// ...}注意使用分组校验时如果字段没有指定groups默认属于Default组。如果指定了groups则不再属于 Default 组。这意味着如果 Controller 使用Validated不加参数即 Default 组那些指定了自定义 Group 的注解将不会生效。四、 异常处理集成参数校验失败时会抛出异常。对于RequestBody参数抛出的是MethodArgumentNotValidException对于RequestParam或路径参数抛出的是ConstraintViolationException。我们需要在全局异常处理器中统一捕获它们RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(MethodArgumentNotValidException.class)publicResult?handleValidationException(MethodArgumentNotValidExceptione){Stringmessagee.getBindingResult().getFieldErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(, ));returnResult.fail(400,message);}ExceptionHandler(ConstraintViolationException.class)publicResult?handleConstraintViolation(ConstraintViolationExceptione){Stringmessagee.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(, ));returnResult.fail(400,message);}}五、 最佳实践总结DTO 与 Entity 分离校验注解通常加在 DTO 上不要直接加在数据库实体 Entity 上。快速失败 (Fail-Fast)默认情况下Validator 会校验所有字段并收集错误。如果希望发现第一个错误就停止可以在类上添加GroupSequence或者自定义 Validator 实现逻辑。明确错误提示每个校验注解都应该指定清晰的message方便前端直接展示给用户。嵌套对象校验如果 DTO 中包含对象如AddressDTO address需要在字段上同时添加Valid才能触发内部对象的校验。复杂逻辑校验对于跨字段校验如“密码”与“确认密码”必须一致建议使用自定义 Class 级别的校验注解。六、 总结参数校验是系统安全的第一道关卡。通过 Spring Validation 框架我们将散落在各处的if-else转化为声明式的注解配合全局异常处理实现了一套既优雅又强大的参数校验方案。掌握这些技巧让你的接口开发事半功倍 福利时间如果你正在备战面试或者想要学习其他知识给大家推荐一个宝藏知识库作者整理了一些列 Java 程序员需要掌握的核心知识有需要的自取不谢。知识库地址https://farerboy.com/

相关新闻

剪映AI配音黑科技曝光:绕过语音克隆限制的3种合法路径(含实操录屏)

剪映AI配音黑科技曝光:绕过语音克隆限制的3种合法路径(含实操录屏)

更多请点击: https://intelliparadigm.com 第一章:剪映AI配音黑科技曝光:绕过语音克隆限制的3种合法路径(含实操录屏) 剪映PC端自v4.0起对AI配音功能实施了严格的语音克隆权限管控,仅限认证企业账号调用“…

2026/7/29 1:04:01阅读更多 →
从零搭建AI视觉品牌系统,深度拆解头部品牌私有化训练数据集构建全流程

从零搭建AI视觉品牌系统,深度拆解头部品牌私有化训练数据集构建全流程

更多请点击: https://kaifayun.com 第一章:AI品牌视觉设计的范式演进与战略定位 AI驱动的品牌视觉设计已从静态符号系统,跃迁为具备感知力、响应性与成长性的动态认知接口。这一转变不仅源于生成式AI技术的成熟,更根植于用户对品…

2026/7/29 1:04:01阅读更多 →
真理映射型人工智能(TMAI)研究综述——基于鸽姆智库与贾子理论体系(KTS)的范式革命分析

真理映射型人工智能(TMAI)研究综述——基于鸽姆智库与贾子理论体系(KTS)的范式革命分析

真理映射型人工智能(TMAI)研究综述——基于鸽姆智库与贾子理论体系(KTS)的范式革命分析 摘要 真理映射型人工智能(Truth-Mapping AI,TMAI)是由鸽姆智库(GG3M Think Tank&#xff0…

2026/7/29 1:02:01阅读更多 →
ARM Linux内核编译实战:从工具链到启动优化的全流程指南

ARM Linux内核编译实战:从工具链到启动优化的全流程指南

1. 项目概述:为什么我们要亲手编译ARM Linux内核? 如果你手头有一块全志方案的开发板,比如Orange Pi Zero 2或者荔枝派Nano,你可能已经体验过直接从官方或社区下载现成的SD卡镜像,刷入、上电、登录,一气呵…

2026/7/29 5:51:36阅读更多 →
IGBT、MOSFET、IGCT全控型器件选型与驱动设计实战指南

IGBT、MOSFET、IGCT全控型器件选型与驱动设计实战指南

1. 项目概述:从“开关”到“智能心脏”的进化聊到电力电子,很多人第一反应是各种复杂的电路图和让人头疼的公式。但如果你把整个电力电子系统想象成一个精密的“能量交通枢纽”,那么全控型器件就是这个枢纽里最核心的“智能交通警察”。它们能…

2026/7/29 5:51:36阅读更多 →
C++20三向比较运算符(<=>)详解:简化自定义类型比较

C++20三向比较运算符(<=>)详解:简化自定义类型比较

1. 项目概述&#xff1a;为什么我们需要三向比较运算符&#xff1f;如果你写过C&#xff0c;尤其是写过自定义类型的比较操作&#xff0c;那你一定对实现operator<、operator、operator>这一系列操作符的繁琐深有体会。这不仅仅是写六个函数那么简单&#xff0c;更头疼的…

2026/7/29 5:51:36阅读更多 →
Playwright多窗口自动化:监听popup事件与Context页面管理实战

Playwright多窗口自动化:监听popup事件与Context页面管理实战

1. 项目概述与核心挑战最近在搞一个电商后台的自动化巡检项目&#xff0c;遇到了一个典型的“多窗口”难题。场景是这样的&#xff1a;脚本需要登录管理后台&#xff0c;点击一个“生成报表”的按钮&#xff0c;这个操作会触发系统在新标签页&#xff08;Tab&#xff09;里打开…

2026/7/29 5:51:36阅读更多 →
Python新手入门:第一次编程作业全指南

Python新手入门:第一次编程作业全指南

1. Python新手入门&#xff1a;第一次编程作业全指南作为一门简单易学但功能强大的编程语言&#xff0c;Python已经成为无数编程初学者的首选。第一次Python作业对建立编程信心至关重要&#xff0c;但很多新手常因环境配置、语法不熟等问题卡在起跑线上。本文将手把手带你完成首…

2026/7/29 5:51:36阅读更多 →
JavaScript字符串比较全解析:从基础运算符到国际化排序实战

JavaScript字符串比较全解析:从基础运算符到国际化排序实战

1. 项目概述&#xff1a;为什么字符串比较是JavaScript的必修课&#xff1f;在JavaScript的世界里&#xff0c;字符串&#xff08;String&#xff09;无处不在。从用户输入的验证、URL参数的解析&#xff0c;到动态内容的渲染、API数据的处理&#xff0c;字符串操作构成了前端乃…

2026/7/29 5:49:35阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停&#xff1f;用 interrupt 给它设个“关卡“&#xff01; 在构建复杂的 Agent 系统时&#xff0c;我们经常会遇到这样的场景&#xff1a;Agent 正在执行一个多步骤的任务&#xff0c;比如“下单购买商品”&#xff0c;但执行到一半时&#xff0c;我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日&#xff0c;国际专注开放式技术研发的声学品牌Nank南卡&#xff0c;正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手&#xff1f;而且是选择曾舜晞&#xff1f;让我们一起来探索一下&#xff01;比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/29 4:31:51阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →