使用spring-boot-starter-validation进行参数校验
目录一、maven 依赖二、全局异常处理1.定义通用返回类2.全局异常处理类三、Valid / Validated1.Valid最常用2.ValidatedSpring 提供增强版四、常见校验注解1. NotNull最基础2. NotEmpty比 NotNull 严格一点3. NotBlank字符串专用最常用4. Length字符串长度Hibernate 扩展5. Size通用长度校验6. Min / Max数值范围7. Positive / PositiveOrZero推荐8. Email邮箱校验9. Pattern正则校验强力10. AssertTrue / AssertFalse五、测试1.post 接口2.get 请求一、maven 依赖对于 Spring Boot 2.x :dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency对于 Spring Boot 3.xJakarta 包名:依赖不变但代码里引用的包名发生变化javax.validation.* → jakarta.validation.*如果没引入这个依赖Valid 不生效校验注解写了等于没写二、全局异常处理全局异常处理用于参数校验失败以及业务异常时将接口错误信息返回1.定义通用返回类publicclassApiResultT{privateintcode;privateStringmessage;privateTdata;publicstaticTApiResultTfail(Stringmessage,Tdata){returnnewApiResult(400,message,data);}publicApiResult(){}publicApiResult(intcode,Stringmessage,Tdata){this.codecode;this.messagemessage;this.datadata;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.codecode;}publicStringgetMessage(){returnmessage;}publicvoidsetMessage(Stringmessage){this.messagemessage;}publicTgetData(){returndata;}publicvoidsetData(Tdata){this.datadata;}}2.全局异常处理类importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjavax.validation.ConstraintViolationException;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;RestControllerAdvicepublicclassGlobalExceptionHandler{/** RequestBody 校验失败 **/ExceptionHandler(MethodArgumentNotValidException.class)publicApiResultListMapString,StringhandleMethodArgumentNotValid(MethodArgumentNotValidExceptionex){ListMapString,Stringerrorsex.getBindingResult().getFieldErrors().stream().map(e-{MapString,StringmnewHashMap();m.put(field,e.getField());m.put(message,e.getDefaultMessage());returnm;}).collect(Collectors.toList());returnApiResult.fail(参数校验失败,errors);}/** RequestParam / PathVariable 校验失败 **/ExceptionHandler(ConstraintViolationException.class)publicApiResultListMapString,StringhandleConstraintViolation(ConstraintViolationExceptionex){ListMapString,Stringerrorsex.getConstraintViolations().stream().map(v-{MapString,StringmnewHashMap();// propertyPath 形如get.id / method.arg0m.put(field,v.getPropertyPath().toString());m.put(message,v.getMessage());returnm;}).collect(Collectors.toList());returnApiResult.fail(参数校验失败,errors);}}三、Valid / Validated1.Valid最常用importjakarta.validation.Valid;作用触发校验本身不定义规则常见位置Controller 方法参数、成员变量级联校验示例PostMapping(/add)publicvoidadd(RequestBodyValidUserDTOdto){}没有 ValidUserDTO 里的所有校验注解都不会执行2.ValidatedSpring 提供增强版importorg.springframework.validation.annotation.Validated;特点支持分组校验可用在 类、方法上示例ValidatedRestControllerpublicclassUserController{}90% 场景用 Valid 即可四、常见校验注解1. NotNull最基础含义不能为 null可以是空字符串 “”适用类型所有对象类型Integer、Long、String、List…NotNull(message用户ID不能为空)privateLonguserId;2. NotEmpty比 NotNull 严格一点含义不能为 null不能为 “”集合不能是空集合适用类型StringCollection / Map / ArrayNotEmptyprivateStringname;NotEmptyprivateListStringroles;3. NotBlank字符串专用最常用含义不能为 null不能为 “”不能是 空白适用类型适用于 StringNotBlank(message用户名不能为空)privateStringusername;4. Length字符串长度Hibernate 扩展适用类型只能用于 Stringimportorg.hibernate.validator.constraints.Length;Length(min6,max20,message长度必须在6-20位之间)privateStringpassword;5. Size通用长度校验Size(min1,max5)privateListLongids;适用类型StringCollectionMapArray与 Length 区别注解 适用范围Length : StringHibernateSize : String 集合标准6. Min / Max数值范围Min(1)Max(100)privateIntegerage;⚠️ 不能校验字符串7. Positive / PositiveOrZero推荐Positive// 0PositiveOrZero// 0PositiveprivateLongamount;8. Email邮箱校验Email(message邮箱格式不正确)privateStringemail;9. Pattern正则校验强力Pattern(regexp^1[3-9]\\d{9}$,message手机号格式错误)privateStringphone;10. AssertTrue / AssertFalseAssertTrueprivateBooleanagree;五、测试importorg.hibernate.validator.constraints.Length;importjavax.validation.Valid;importjavax.validation.constraints.Email;importjavax.validation.constraints.Min;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotEmpty;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Positive;importjava.util.List;publicclassStudent{NotBlank(message用户名不能为空)privateStringname;NotBlank(messagestuendId不能为空)Length(min6,max20,messagestuendId长度必须在6-20位之间)privateStringstuendId;NotNull(messageteacherName不能为null)privateStringteacherName;Min(value18,message年龄必须大于18岁)privateIntegerage;Email(message邮箱格式不正确)privateStringemail;Positive(messageamount要大于0)privateLongamount;NotEmpty(messageroles不能为空)privateListStringroles;/** 级联校验如果要校验这个列表里的 Address 对象必须加 Valid **/NotNull(message地址列表不能为空)ValidprivateListSendMessageModeladdresses;//省略get、set 方法}importorg.hibernate.validator.constraints.Length;importjavax.validation.constraints.NotBlank;publicclassSendMessageModel{NotBlank(messagemobile不能为空)Stringmobile;Length(min6,max20,messagesign长度必须在6-20位之间)Stringsign;NotBlank(messagecontent不能为空)Stringcontent;//省略get、set 方法}1.post 接口importcom.xiaohaitang.somedemo.exception.Student;importorg.springframework.web.bind.annotation.*;importjavax.validation.Valid;RestControllerRequestMapping(value/apiList)publicclassUsercontroller{PostMapping(value/v1/addStudents)publicStringvalidChechaAddStudents(RequestBodyValidStudentstudent){returnsuccess;}}入参{age:0,email:string,amount:0,addresses:[{}]}响应{code:400,message:参数校验失败,data:[{field:teacherName,message:teacherName不能为null},{field:email,message:邮箱格式不正确},{field:addresses[0].mobile,message:mobile不能为空},{field:amount,message:amount要大于0},{field:age,message:年龄必须大于18岁},{field:name,message:用户名不能为空},{field:addresses[0].content,message:content不能为空},{field:stuendId,message:stuendId不能为空},{field:roles,message:roles不能为空}]}2.get 请求必须在类上增加Validated参数里的校验才会生效importorg.hibernate.validator.constraints.Length;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Positive;Validated// 必须启用方法参数校验RestControllerRequestMapping(value/apiList)publicclassUsercontroller{GetMapping(/test)publicStringtest(RequestParamNotBlank(messagename 不能为空)Length(min6,max20,messagename长度必须在6-20位之间)Stringname,RequestParamNotNull(messageid 不能为空)Positive(messageid 必须大于 0)Longid){returnsuccess;}}入参http://localhost:8080/apiList/test?id0nameaaa响应{code:400,message:参数校验失败,data:[{field:test.id,message:id 必须大于 0},{field:test.name,message:name长度必须在6-20位之间}]}

相关新闻

在 CentOS 7 系统中通过定时任务自动执行 Shell 脚本

在 CentOS 7 系统中通过定时任务自动执行 Shell 脚本

在 CentOS 7 系统中通过定时任务自动执行 Shell 脚本,CentOS 7 默认使用 crontab 工具实现定时任务,这是系统自带、稳定可靠的方案,接下来完整讲解从脚本准备、权限配置到 crontab 编写、管理的全流程。 一、前置准备:编写可执行的…

2026/7/6 8:52:50 阅读更多 →
谷歌seo服务有什么内容?从业十年老兵深度拆解全流程

谷歌seo服务有什么内容?从业十年老兵深度拆解全流程

很多人在找外贸推广或者海外营销的时候,第一个想问的问题就是:谷歌seo服务有什么内容?其实这个问题的答案可深可浅。浅了说就是改改网页、发发外链;深了说,这其实是一场针对搜索引擎算法和用户心理的博弈。今天咱们不整…

2026/7/3 14:53:38 阅读更多 →
Shell脚本命令大全:快速入门与实用案例详解

Shell脚本命令大全:快速入门与实用案例详解

Shell脚本是自动化系统管理任务的核心工具,掌握常用命令能极大提升工作效率。本文不罗列所有命令,而是聚焦于实际工作中最有用、最易出错的命令组合与应用场景,帮助读者建立实用的脚本编写思维。 shell脚本命令如何快速入门 入门shell脚本不…

2026/7/3 14:53:40 阅读更多 →

最新新闻

CodeRed CMS未来路线图:即将推出的功能与改进指南 [特殊字符]

CodeRed CMS未来路线图:即将推出的功能与改进指南 [特殊字符]

CodeRed CMS未来路线图:即将推出的功能与改进指南 🚀 【免费下载链接】coderedcms Wagtail CodeRed Extensions enabling rapid development of marketing-focused websites. 项目地址: https://gitcode.com/gh_mirrors/co/coderedcms CodeRed C…

2026/7/6 20:41:48 阅读更多 →
OpenCV 4.9 与 Ultralytics YOLO 集成:Python 实现 5 行代码实时视频目标检测

OpenCV 4.9 与 Ultralytics YOLO 集成:Python 实现 5 行代码实时视频目标检测

OpenCV 4.9 与 Ultralytics YOLO 集成实战:5行代码构建实时视频分析系统1. 环境准备与工具链配置在开始构建实时视频分析系统之前,我们需要确保开发环境配置正确。以下是推荐的开发环境配置:Python环境要求:Python 3.8或更高版本&…

2026/7/6 20:41:48 阅读更多 →
如何利用deepTools与Python集成实现测序数据的自动化批量处理

如何利用deepTools与Python集成实现测序数据的自动化批量处理

如何利用deepTools与Python集成实现测序数据的自动化批量处理 【免费下载链接】deepTools Tools to process and analyze deep sequencing data. 项目地址: https://gitcode.com/gh_mirrors/de/deepTools 在高通量测序数据分析领域,高效处理海量数据是研究人…

2026/7/6 20:41:48 阅读更多 →
终极OnionOS使用指南:为Miyoo Mini/Mini+打造完美复古游戏体验

终极OnionOS使用指南:为Miyoo Mini/Mini+打造完美复古游戏体验

终极OnionOS使用指南:为Miyoo Mini/Mini打造完美复古游戏体验 【免费下载链接】Onion OS overhaul for Miyoo Mini and Mini 项目地址: https://gitcode.com/gh_mirrors/on/Onion OnionOS是一款专为Miyoo Mini和Mini掌机设计的增强型操作系统,通过…

2026/7/6 20:33:46 阅读更多 →
SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊

SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊

SRN-Deblur技术原理揭秘:Scale-recurrent Network如何实现高效图像去模糊 【免费下载链接】SRN-Deblur Repository for Scale-recurrent Network for Deep Image Deblurring 项目地址: https://gitcode.com/gh_mirrors/sr/SRN-Deblur SRN-Deblur是一个基于Sc…

2026/7/6 20:31:46 阅读更多 →
nest_asyncio 常见问题解答(FAQ):解决开发者遇到的实际问题

nest_asyncio 常见问题解答(FAQ):解决开发者遇到的实际问题

nest_asyncio 常见问题解答(FAQ):解决开发者遇到的实际问题 【免费下载链接】nest_asyncio Patch asyncio to allow nested event loops 项目地址: https://gitcode.com/gh_mirrors/ne/nest_asyncio nest_asyncio 是一个专为解决 Pyth…

2026/7/6 20:29:45 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻