当前位置: 首页 > news >正文

Spring Boot参数校验全流程解析

目录

1、异常校验完整逻辑

1.1、📍以角色名称为例

🧩 首先进行前端校验 ——(满足用户体验)

🧠第一步:设计表单结构页面文件

🧠第二步:点击确定按钮(submitForm方法)

🧠第三步:触发表单校验规则(rules)

🧠第四步:使用开发者工具查看接口

🧠第五步:定位到前端拦截器源码——request.js:101:1

🧠小结

🧩 其次进行后端校验 ——(为了系统安全)

🧠第一步:后端接收PUT/system/role请求

🧠第二步:校验阶段——Spring看到@Validated-->自动化校验SysRole字段

🧠第三步:判断当前的控制台日志

🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”

🧠小结

1.2 、📍若依中其他异常校验——以添加岗位为例

🧩 首先进行前端校验 ——(满足用户体验)

🧠第一步:设计表单结构页面文件

🧠第二步:点击确定按钮(submitForm方法)

🧠第三步:触发表单校验规则(rules)

🧠第四步:使用开发者工具查看接口

🧠第五步:定位到前端拦截器源码——request.js:101:1

🧩 其次进行后端校验 ——(为了系统安全)

🧠第一步:后端接收POST/system/post请求

🧠第二步:校验阶段——Spring看到@Validated-->自动化校验SysPost字段

🧠第三步:判断当前的控制台日志

🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”

 🧠完整流程回顾

🧪 常见校验注解(配合 @Validated 使用)

2、自定义一个参数验证注解

🎯目标:

🎯第一步:理解“自定义校验注解”的组成

🎯第二步:创建自定义注解@NoSpecialChars

🎯第三步:创建校验器NoSpecialCharsValidator

🎯第四步:在实体类上使用这个注解

🎯第五步:测试效果


  • 用户输入 → 数据传输 → 自动校验 → 异常捕获 → 错误提示

  • 前端校验优先执行,后端进行二次校验(安全兜底)

1.1、📍以角色名称为例

🧩 首先进行前端校验 ——(满足用户体验)

       🧠第一步:设计表单结构页面文件
  •    路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\role\index.vue

🧠第二步:点击确定按钮(submitForm方法)
  • 路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\role\index.vue

🧠第三步:触发表单校验规则(rules
  • 因为在第二步点击确定按钮会触发一个表达校验,所以需要提前写好表单校验规则
  • 路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\role\index.vue

🧠第四步:使用开发者工具查看接口

🧠第五步:定位到前端拦截器源码——request.js:101:1

🧠小结

🧩 其次进行后端校验 ——为了系统安全)

  • 👏异常:当前端校验失败时,直接制止
  • 那么why要进行后端校验(防止黑客等直接绕过前端对数据进行修改或者直接使用postman等工具对后端进行校验.......即确保安全性
🧠第一步:后端接收PUT/system/role请求
  • 定位到后端api的system/role

🧠第二步:校验阶段——Spring看到@Validated-->自动化校验SysRole字段

🧠第三步:判断当前的控制台日志

  • 说明 @Validated 已经生效,抛出了 MethodArgumentNotValidException
🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”

🧠小结


1.2 、📍若依中其他异常校验——以添加岗位为例

🧩 首先进行前端校验 ——(满足用户体验)

       🧠第一步:设计表单结构页面文件
  •    路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\post\index.vue

🧠第二步:点击确定按钮(submitForm方法)
  • 路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\post\index.vue

🧠第三步:触发表单校验规则(rules
  • 因为在第二步点击确定按钮会触发一个表达校验,所以需要提前写好表单校验规则
  • 路径:RuoYi-Vue-v3.8.2\ruoyi-ui\src\views\system\post\index.vue

🧠第四步:使用开发者工具查看接口

🧠第五步:定位到前端拦截器源码——request.js:101:1

🧩 其次进行后端校验 ——为了系统安全)

🧠第一步:后端接收POST/system/post请求
  • 定位到后端api的system/post

🧠第二步:校验阶段——Spring看到@Validated-->自动化校验SysPost字段

🧠第三步:判断当前的控制台日志

🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”

 🧠完整流程回顾
步骤代码位置作用
1. 前端提交空角色名ruoyi-ui/src/views/system/role/form.vue发送 { roleName: "" }
2. 后端接收请求SysRoleController.add()使用 @Validated @RequestBody SysRole role
3. 触发校验SysRole.roleName 字段上的 @NotBlank检查是否为空
4. 抛出异常自动抛出 MethodArgumentNotValidException不执行后续代码
5. 全局异常处理GlobalExceptionHandler.handleMethodArgumentNotValidException()返回 {"code":500, "msg":"角色名称不能为空"}
6. 前端拦截器弹窗ruoyi-ui/src/utils/request.js弹出错误提示
🧪 常见校验注解(配合 @Validated 使用)
注解作用示例
@NotBlank字符串非 null 且非空(trim 后长度 > 0)" " 也会报错
@NotNull不能为 null(但可以是空字符串)"" 是允许的
@NotEmpty不能为 null 且长度 > 0(用于 List/String)"" 不允许
@Email必须是合法邮箱"abc@gmail.com" ✅
@Size(min=2, max=10)长度限制角色名 2~10 个字符
@Pattern(regexp = "...")正则匹配只能字母数字

2、自定义一个参数验证注解

🎯目标:
  • 当用户在“部门管理”中输入的部门名称包含非法字符(EG:@、#、$)时,自动出发校验失败,抛出异常,并返回友好错误提示

🎯第一步:理解“自定义校验注解”的组成

Spring Boot的JSR-303校验支持自定义注解,需要两个东西:

  • 一个注解类(eg:@NoSpecialChars)
  • 一个校验器类(实现ConstrainValidator接口)

注解类和校验器类的关系就像:

  • “这个字段需要满足什么规则”——注解
  • “怎么判断他是否满足”——校验器
🎯第二步:创建自定义注解@NoSpecialChars

🎯第三步:创建校验器NoSpecialCharsValidator

🎯第四步:在实体类上使用这个注解
  • 我们需要校验的是岗位名称(postName)

现在postName有三个校验

  • 不能为空(@NotBlank)
  • 长度限制(@Size)
  • 不能有特殊字符(@NoSpecialChars)
🎯第五步:测试效果

🎯总结:做了什么?

步骤动作关键点
1创建注解 @NoSpecialChars定义规则“长什么样”
2创建校验器 NoSpecialCharsValidator定义“怎么判断”
3在 SysDept.deptName 上加注解应用规则
4测试提交非法数据触发异常
http://www.dtcms.com/a/605305.html

相关文章:

  • C++进阶:(十)深度解析哈希表:原理、实现与实战
  • 6.3 代码自动生成Agent:程序员的AI副驾驶
  • 最好的网站开发系统网站设计介绍怎么写
  • 如何丰富网站内容在本地搭建wordpress
  • MySQL: 存储引擎深度解析:Memory与Federated的特性与应用场景
  • Java+Leaflet:湖南省道路长度WebGIS的构建与实践
  • 大模型强化学习GRPO-1
  • 网站建设与管理基础带端口的服务器怎么做网站
  • 金融/医疗/教育的第三方软件检测有哪些特别关注点?
  • 文本处理工具:grep、awk、sed 的高级文本分析与处理
  • 【图像处理基石】什么是光流法?
  • Spring事务隔离级别全解析:从读未提交到序列化
  • PostIn从初级到进阶(4) - 如何使用Mock数据尽早满足前后端接口开发需求
  • 建设机械官方网站门源网站建设公司
  • 用 Doris 托底实时明细与聚合Flink CDC Pipeline 的 Doris Sink 实战
  • FLINK CDC 的学习
  • AI音乐生成 | 音乐流派分类的原理和python实现
  • WSL下将Ubuntu从C盘迁移到D盘(个人记录、详细图解)
  • LRU缓存淘汰算法详解与C++实现
  • AbMole小讲堂丨Cyclophosphamide(环磷酰胺):应用于肿瘤与免疫研究的热门烷化工具
  • 网站建设费用如何收取什么叫网站开发应用框架
  • 怎么在.Net中做团购网站专门做钻石国外网站
  • 教程上新丨Deepseek-OCR 以极少视觉 token 数在端到端模型中实现 SOTA
  • Mac多功能音视频AI处理工具VideoProc Converter AI
  • 【技术贴】全链路协同!艾为电子开启端侧AI音频“精而优”时代
  • 2025国产ITSM厂商选型指南:从基础流程、智能赋能到全链路协同方案的全面对比
  • 数据结构——四十二、二叉排序树(王道408)
  • VueUse的使用
  • 【LeetCode】111. 二叉树的最小深度
  • 如何将html发布到网站wordpress用户筛选