若依框架实战:参数验证异常处理(手机号码格式验证案例)
一、前言
在后端开发中,参数校验是保证接口健壮性的第一道防线。若依(Ruoyi)框架作为主流的 Java 后台管理系统框架,内置了完善的参数验证与全局异常处理机制。
本文将以用户管理模块的手机号码格式验证为例,从触发验证、异常抛出、源码分析、异常总结四个维度,详解若依框架下参数验证异常的完整处理流程。
二、验证场景简介
1. 业务场景
用户管理 - 修改用户信息访问路径:系统管理 → 用户管理 → 修改
2. 验证目标
- 字段:
phonenumber(手机号码) - 验证规则:
@NotBlank:手机号码不能为空@Pattern:必须符合 11 位手机号格式
3. 测试用例
表格
| 测试输入 | 验证结果 |
|---|---|
| 13812345678 | 正常(11 位) |
| 12345 | 格式错误(过短) |
| 123456789012 | 格式错误(过长) |
三、触发验证并抛出异常
1. 操作步骤
- 进入:系统管理 → 用户管理
- 点击:修改按钮
- 输入:123456789012(12 位手机号,超出长度限制)
2. 前端验证效果
前端会直接拦截请求,弹出提示:
手机号码格式不正确,请输入 11 位有效手机号
前端验证说明
- 基于
@Pattern注解自动生成校验规则 - 失焦 / 提交时触发校验
- 阻止表单提交,友好提示
3. 后端异常日志
IDEA 控制台输出如下异常:
java
运行
2024-01-15 14:32:18.456 [http-nio-8080-exec-5] ERROR c.r.f.w.e.GlobalExceptionHandler - [validExceptionHandler,104] Validation failed for argument [0] in public com.ruoyi.common.core.domain.AjaxResult com.ruoyi.web.controller.system.SysUserController.edit(...): [Field error in object 'sysUser' on field 'phonenumber': rejected value [123456789012]; default message [手机号码格式不正确]]异常核心信息
- 异常捕获:
GlobalExceptionHandler - 异常位置:
SysUserController.edit() - 异常类型:
MethodArgumentNotValidException - 错误字段:
sysUser.phonenumber格式错误
四、完整源码分析
1. 前端实现(Vue + ElementUI)
表单组件(edit.vue)
vue
<el-form-item label="手机号码" prop="phonenumber"> <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" /> </el-form-item>验证规则
javascript
运行
rules: { phonenumber: [ { required: true, message: "手机号码不能为空", trigger: "blur" }, { pattern: /^1[3-9]\d{9}$/, message: "手机号码格式不正确", trigger: "blur" } ] }提交方法
javascript
运行
updateUser() { this.$refs["form"].validate(valid => { if (valid) { updateUser(this.form).then(res => { this.msgSuccess("修改成功"); }); } }); }API 封装(user.js)
javascript
运行
// 更新用户信息 export function updateUser(data) { return request({ url: '/system/user', method: 'put', data: data }) }2. 后端实现(SpringBoot + Validation)
Controller 层(SysUserController.java)
java
运行
@RestController @RequestMapping("/system/user") public class SysUserController { @PutMapping public AjaxResult edit(@Validated @RequestBody SysUser user) { return userService.updateUser(user); } }实体类校验(SysUser.java)
java
运行
public class SysUser extends BaseEntity { @NotBlank(message = "手机号码不能为空") @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确") private String phonenumber; // getter & setter }全局异常处理(GlobalExceptionHandler.java)
java
运行
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public AjaxResult validExceptionHandler(MethodArgumentNotValidException e) { String message = e.getBindingResult().getFieldError().getDefaultMessage(); return AjaxResult.error(message); } }五、参数验证生效必备条件
若要让后端参数验证正常生效、抛出异常但不崩溃,必须满足以下 4 点:
添加验证注解在实体类字段上添加
@NotBlank、@Pattern、@NotNull等校验注解。开启验证注解Controller 接口参数添加
@Validated注解。全局异常处理器使用
@RestControllerAdvice注册全局异常处理类。捕获对应异常精准捕获
MethodArgumentNotValidException参数验证异常。
六、注意事项
@NotNull不建议用于基本数据类型(int、long 等有默认值,无法校验 null)- 建议使用包装类型(Integer、Long、String)配合校验
- 前端校验 + 后端校验双重保障,避免非法参数入库
- 正则表达式需严格匹配业务规则(手机号:
^1[3-9]\\d{9}$)
七、总结
本文通过手机号码验证实战案例,完整演示了若依框架下:
- 前端表单校验逻辑
- 后端参数校验注解
- 全局异常捕获与返回
- 验证异常完整链路
掌握这套机制,可快速实现统一、规范、安全的接口参数校验,提升系统稳定性与开发效率。
