目录
2.MethodArgumentNotValidException
1.触发验证抛出异常及前后端现象
前端现象
后端现象
11:12:35.573 [http-nio-8080-exec-53](线程) ERROR(log级别) c.r.f.w.e.GlobalExceptionHandler (异常捕获器)- [handleMethodArgumentNotValidException,101] - Validation failed for argument [0] in public com.ruoyi.common.core.domain.AjaxResult com.ruoyi.web.controller.system.SysDeptController.edit(出异常的文件)(com.ruoyi.common.core.domain.entity.SysDept): [Field error in object 'sysDept' on field 'deptName': rejected value [ ](具体方位); codes [NotBlank.sysDept.deptName,NotBlank.deptName,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [sysDept.deptName,deptName]; arguments []; default message [deptName]]; default message [部门名称不能为空]]
MethodArgumentNotValidException为异常类型
2.前后端代码分析
前端代码分析
表单校验的方法为rules
rules内容里要求部门名称不能为空,但我们打了空格骗过了前端使其能给后端发信息
查看提交方法submitForm,其中updataDept发起HTTP PUT与后台交互,请求URL:/system/dept
后端返回信息"部门名称不能为空",前端的处理逻辑,返回code 为500 时,输出错误提示Message 框
/src/utils/request.js
后端代码分析
后端引起异常的部分原因
这里看到可引起异常的有:部门名称已存在,上级部门不能是自己,该部门包含未停用的子部门
SysDept 类对属性deptId 的限制如下 原因:当deptId 不满足两个注解限制时,会抛出异常
异常处理
1.checkDeptNameUnique
如上上图,若异常为“部门名称已存在,上级部门不能是自己,该部门包含未停用的子部门”
捕获器为checkDeptNameUnique,
如上上图处理函数为
public AjaxResult edit(@Validated @RequestBody SysDept dept)
并return AjaxResult.error的内容(这里不知道异常类型怎么写)
2.MethodArgumentNotValidException
这里空格的异常处理类为MethodArgumentNotValidException,
3.总结触发验证抛出异常的过程
- 修改前端部门名称为空格
- 点击确定与后台交互,请求URI:/system/role
- 后台检测到SysDept 的参数deptId 不符合要求,则抛出异常类型MethodArgumentNotValidException
- 异常被全局异常处理器捕获,返回message 给到前端,且错误码是500
- 前端路由截获错误码500 的信息,进行处理显示message 内容
其中
后端参数验证生效且程序抛出异常不崩溃,需要如下条件:
- 参数验证注解修饰在所需类属性的getter 或属性上
- 使用注解@Validated 修饰接口函数的对应类的形参
- @RestControllerAdvice 注册全局异常处理类
- 正确处理类型MethodArgumentNotValidException 异常
4.自定义参数验证注解,触发验证抛出异常报错实践
注解限制类型
这里我们使用@Pattern