Spring Boot参数校验全流程解析

目录

1、异常校验完整逻辑

1.1、📍以角色名称为例

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

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

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

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

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

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

🧠小结

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

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

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

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

[🧠第四步:找到"全局异常处理器"------RuoYi 项目中所有异常的"总拦截器"](#🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”)

🧠小结

[1.2 、📍若依中其他异常校验------以添加岗位为例](#1.2 、📍若依中其他异常校验——以添加岗位为例)

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

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

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

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

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

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

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

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

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

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

[🧠第四步:找到"全局异常处理器"------RuoYi 项目中所有异常的"总拦截器"](#🧠第四步:找到“全局异常处理器”——RuoYi 项目中所有异常的“总拦截器”)

🧠完整流程回顾

[🧪 常见校验注解(配合 @Validated 使用)](#🧪 常见校验注解(配合 @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 测试提交非法数据 触发异常
相关推荐
阿珊和她的猫12 小时前
Webpack 打包体积优化:让应用更轻量、更高效
前端·webpack·状态模式
Jonathan Star2 天前
在 LangFlow 中,**节点(Node)是构成工作流的核心基本单元**
状态模式
WYiQIU2 天前
大厂前端岗重复率极高的场景面试原题解析
前端·javascript·vue.js·react.js·面试·状态模式
咖啡の猫3 天前
Vue基本路由
前端·vue.js·状态模式
一水鉴天4 天前
整体设计 全面梳理复盘 之27 九宫格框文法 Type 0~Ⅲ型文法和 bnf/abnf/ebnf 之1
人工智能·状态模式·公共逻辑
o0向阳而生0o8 天前
110、23种设计模式之状态模式(19/23)
设计模式·状态模式
小雨青年9 天前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
ACGkaka_9 天前
设计模式学习(十二)状态模式
学习·设计模式·状态模式
火车叨位去194910 天前
软件设计模式(tyutJAVA 状态模式实验)
设计模式·状态模式