【RuoYi-Vue-Plus】学习笔记 40 - Validator(一)校验器对 Model 属性校验调用流程分析

前言

前几天群里聊到了有关 EasyExcel 导入校验的问题,因为用到了 Spring Validation 校验(底层是 Hibernate Validator),加上涉及到监听器等方面的组件,所以本篇先对 Hibernate Validator 校验流程进行分析,后面会单独再出一篇关于 EasyExcel 导入流程校验的文章。

参考目录

框架集成

1、Maven

ruoyi-common 模块 pom.xml
在这里插入图片描述
由 Spring Boot 引入 spring-boot-dependencies-2.7.3.pom
在这里插入图片描述

2、校验框架配置类 ValidatorConfig

在这里插入图片描述
fail_fast 模式实际上就是报错了之后立即返回,不再校验后面的参数,如果需要返回所有的错误信息(例如 Excel 导入数据验证),则此处可以不设置或者设置为 false

3、测试方法

简单起见,我用了原有的 TestDemoBo 对象,对属性 id 进行非空校验。

com.ruoyi.demo.controller.TestDemoController#testValidator
在这里插入图片描述
注:这里的测试方法只是为了演示方便,所以直接在 Controller 调用了 mapper 的方法,实际开发中请遵守代码规范进行编写。

com.ruoyi.demo.domain.bo.TestDemoBo
在这里插入图片描述
估计很多朋友看我的博客的时候都不会去看参考文档,所以我在此再强调一下,@Validated 是 Spring 官方提供的校验注解,里面增加了对分组 groups 的支持。

分组的好处是:同一个对象,可以根据不同的业务功能进行不同的分组校验(例如,新增——AddGroup,编辑——EditGroup),无需再重复编写类似的多个对象(例如,新增——AddBo,编辑——EditBo),避免过多的冗余代码。

4、接口测试

4.1、校验失败(参数为 null)

在这里插入图片描述
控制台输出(部分):
在这里插入图片描述

4.2、校验成功(参数不为 null)

在这里插入图片描述
控制台输出:
在这里插入图片描述
下面对于校验失败的流程进行简单分析。

执行流程分析

在 Spring 处理请求时,需要先对请求参数进行解析,Validator 校验器就是在参数解析前根据注解来进行校验。

InvocableHandlerMethod#invokeForRequest

在这里插入图片描述

InvocableHandlerMethod#getMethodArgumentValues

在这里插入图片描述

Model 参数解析 ModelAttributeMethodProcessor#resolveArgument

在这里插入图片描述
在这里插入图片描述

验证适用判断 ModelAttributeMethodProcessor#validateIfApplicable

在这里插入图片描述
ValidationAnnotationUtils#determineValidationHints
在这里插入图片描述
请求参数标注了 @Validated,返回适配的验证提示(QueryGroup)。

ValidationAnnotationUtils#convertValidationHints
在这里插入图片描述
validationHints 不为 null,需要进行校验。
在这里插入图片描述

DataBinder#validate

在这里插入图片描述

在这里插入图片描述

ValidatorAdapter#validate

在这里插入图片描述

SpringValidatorAdapter#validate

在这里插入图片描述

Hibernate 校验器 ValidatorImpl#validate

在这里插入图片描述

上下文分组校验 ValidatorImpl#validateInContext

在这里插入图片描述
ValidatorImpl#validateConstraintsForCurrentGroup
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
此处循环校验所有的约束。

校验约束 ValidatorImpl#validateMetaConstraint

在这里插入图片描述
判断是否需要验证 ValidatorImpl#isValidationRequired,此处只有属性 id 需要校验。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
判断完成,回到 ValidatorImpl#validateMetaConstraint 继续进行校验。
在这里插入图片描述

在这里插入图片描述

MetaConstraint#doValidateConstraint
在这里插入图片描述

校验约束 ConstraintTree#validateConstraints

在这里插入图片描述

SimpleConstraintTree#validateConstraints

在这里插入图片描述

单一约束判断 ConstraintTree#validateSingleConstraint

在这里插入图片描述

Not Null 校验器 NotNullValidator#isValid

在这里插入图片描述
至此可知校验结果为 false

返回校验结果

ConstraintTree#validateSingleConstraint
在这里插入图片描述

SimpleConstraintTree#validateConstraints
在这里插入图片描述

ConstraintTree#validateConstraints
在这里插入图片描述

MetaConstraint#doValidateConstraint
在这里插入图片描述

ValidatorImpl#validateMetaConstraint
在这里插入图片描述
判断是否是 fail_fast 模式:
在这里插入图片描述

在这里插入图片描述

ValidatorImpl#validateInContext
在这里插入图片描述

抛出异常 ModelAttributeMethodProcessor#resolveArgument

在这里插入图片描述

全局异常捕获 GlobalExceptionHandler#handleBindException

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichelleChung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值