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

news/2024/4/29 23:44:41/文章来源:https://blog.csdn.net/Michelle_Zhong/article/details/126817270

文章目录

    • 前言
    • 参考目录
    • 框架集成
      • 1、Maven
      • 2、校验框架配置类 `ValidatorConfig`
      • 3、测试方法
      • 4、接口测试
      • 4.1、校验失败(参数为 null)
      • 4.2、校验成功(参数不为 null)
    • 执行流程分析
      • `InvocableHandlerMethod#invokeForRequest`
      • `InvocableHandlerMethod#getMethodArgumentValues`
      • Model 参数解析 `ModelAttributeMethodProcessor#resolveArgument`
      • 验证适用判断 `ModelAttributeMethodProcessor#validateIfApplicable`
      • `DataBinder#validate`
      • `ValidatorAdapter#validate`
      • `SpringValidatorAdapter#validate`
      • Hibernate 校验器 `ValidatorImpl#validate`
      • 上下文分组校验 `ValidatorImpl#validateInContext`
      • 校验约束 `ValidatorImpl#validateMetaConstraint`
      • 校验约束 `ConstraintTree#validateConstraints`
      • `SimpleConstraintTree#validateConstraints`
      • 单一约束判断 `ConstraintTree#validateSingleConstraint`
      • Not Null 校验器 `NotNullValidator#isValid`
      • 返回校验结果
      • 抛出异常 `ModelAttributeMethodProcessor#resolveArgument`
      • 全局异常捕获 `GlobalExceptionHandler#handleBindException`

前言

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

参考目录

  • Hibernate Validator 6.2.4.Final - Jakarta Bean Validation Reference Implementation: Reference Guide
    Hibernate Validator V6.2.4.Final 官方文档(Spring Boot V2.7.3 集成)
  • Java Bean Validation
    Spring Framework V5.3.22 官方文档(Spring Boot V2.7.3 集成)
  • springboot 配置 Validator 校验框架国际化 支持快速返回(@疯狂的狮子Li)
    框架集成 Validator 介绍
  • Validated、Valid 、Validator,他们的区别你知道几个(@琦彦)
    关于 @Validated、@Valid 的介绍,很详细,建议读一读
  • Spring Boot 从入门到实战 - 4.4 数据验证(@章为忠)
  • SpringBoot 如何进行参数校验,老鸟们都这么玩的!(@飘渺Jam)

框架集成

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_6552.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来自邦卡的神奇扁平超级英雄插图

平面设计趋势正在相当大程度上动摇平面设计行业的各个方面。我们正在进入一个简单和最低限度的沟通模式的新时代,在这个时代中,平面设计似乎以最好的方式提供。 受平面设计形式的启发,法国平面设计师邦卡采用了相同的方法,创作了一系列简约、平面的超级英雄插图。这些插图涵…

自制操作系统日志——第二十二天

自制操作系统日志——第二十二天 今天,我们将继续再完善一下保护操作系统的内容,以及进一步的利用c语言显示字符串! 文章目录自制操作系统日志——第二十二天一、保护操作系统3手动强制关闭应用程序二、用c语言显示字符串API 显示窗口总结一…

vivado使用方法(初级)

文章目录1 创建新工程1.1 工程创建1.2 新建Verilog文件1.3 仿真参考1 创建新工程 1.1 工程创建 1、首先打开Vavido软件,点击Creat Project或者在File——>Project——>New里面进行新工程的创建 2、然后在弹出的界面上点击Next进入下一个界面进行项目的命名…

全站最简单 “数据滚动可视化大屏” 【JS基础拿来即用】

源码获取方式: 数据滚动大屏源码,原生js实现超级简单-Javascript文档类资源-CSDN下载原生js实现的数据滚动大屏案例,实现应该是全网最简单的,拿来直接使用即可,没有会员的小伙伴去我文章主更多下载资源、学习资料请访问…

基于Python实现的遗传算法求TSP问题

遗传算法求TSP问题 目录 人工智能第四次实验报告 1 遗传算法求TSP问题 1 一 、问题背景 1 1.1 遗传算法简介 1 1.2 遗传算法基本要素 2 1.3 遗传算法一般步骤 2 二 、程序说明 3 2.3 选择初始群体 4 2.4 适应度函数 4 2.5 遗传操作 4 2.6 迭代过程 4 三 、程序测试 5 3.1 求解…

Vue3+elementplus搭建通用管理系统实例七:通用表格实现上

一、本章内容 使用配置的方式实现表格的界面的自动生成、自动解析实体配置信息,并生成表格列、筛选项等功能,完整课程地址 二、效果预览 三、开发视频

动手实现深度学习(12): 卷积层的实现

9.1 卷积层的运算 传送门: https://www.cnblogs.com/greentomlee/p/12314064.html github: Leezhen2014: https://github.com/Leezhen2014/python_deep_learning 卷积的forward 卷积的计算过程网上的资料已经做够好了,没必要自己再写一遍。只把资料搬运到这里: http://deepl…

【进击的JavaScript|高薪面试必看】JS基础-作用域和闭包

六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,项目实战经验,面试指导 关注博主不迷路~ 本系列文章是博主精心整理的面试热点问题,吸收了大量的技术博客与面试文章,总结多年…

Java毕设项目——网上宠物店管理系统(java+SSM+Maven+Mysql+Jsp)

文末获取源码 开发语言:Java 框架:SSM 技术:Jsp JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&#xff1a…

收银台——Web自动化测试

目录 一,收银台项目的主要功能: 二,Web自动化测试 一,Web自动化测试,设计测试用例 二,编写测试用例代码 三,测试结果: 四,总结: 一,收银台项…

JVM监控:JMX组件与底层原理

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架 ,从Java5.0开始引入到标准Java技术平台中。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 其实JMX也可以看作一个框架&a…

一建报名重大变动 部分专业考生2022年不能报名一级建造师考试?

2022年度一级建造师资格考试报名证明事项实行告知承诺制,应试人员须通过中国人事考试网的全国专业技术人员资格考试报名服务平台进行网上注册、报名和缴费。 云南报名时间:2022年9月14日—9月21日;缴费截止时间:9月14日—9月23日…

【Android】App开发-控件篇

App开发是一个工作量比较大的项目,要学习App开发首先我们要先去学习手机中的各类工具和信息是怎么运行的,我们可以使用哪些工具来对手机进行设置。这里我采用的开发工具是Android studio。 目录 Textview控件 文本框控件: 阴影/模糊度控件…

第12章 软件测试基础 12.1-软件测试 12.2-验证与确认 12.3-软件缺陷

目录 一、软件测试基础主要内容 二、软件测试 1、软件测试的定义 2、软件测试的对象 3、软件测试的目的 4、考点 (1)软件测试的目的 (2)软件测试的对象 三、验证与确认 1、验证(Verification) 2、确认&…

pycharm安装opencv-python报错

嘿嘿,大家好,我又遇到拦路的小可爱了! 报错内容 3): Read timed out. WARNING: You are using pip version 21.3.1; however, version 22.2.2 is available. You should consider upgrading via the E:\daimabao\python\bigdata\Scripts\pyt…

【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信

串口通信例程讲解若要观看该博客配套的视频教程,可点击此链接根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤。比如非常简单的项目,我们可以省去虚线框里面的…

【数据结构】二叉树的遍历

文章目录 5.3 二叉树的遍历 5.3.1 概述 5.3.2 遍历方式【重点】 5.3.3 遍历方式:递归实现【重点】 5.3.4 遍历方式:非递归实现 5.3 二叉树的遍历 5.3.1 概述 二叉树的遍历:沿着某条搜索路径对二叉树中的结点进行访问,使得每…

grpc|protobuf的安装、编译、运行笔记(C++)

一、下载grpc源码 如果你的电脑/服务器可以做代理,然后稳定链接上 GitHub 那么完全可以按照 GitHub 的官方文档来操作,我这里采用 Gitee 镜像来操作 git clone https://gitee.com/jiangxy__loey/grpc.git二、下载依赖库 进入grpc目录,然后…

为什么残差连接的网络结构更容易学习?

为什么残差连接的网络结构更容易学习? 【写在前面】 不仅仅在resnet中,在各种网络结构中大家都喜欢使用残差连接的设计,并声称这有利于网络的优化,这是为什么呢?能给出一个有说服力的答案吗? Why the re…

1.数据校验-拦截器-全局异常-json数据处理

目录 1.数据校验-拦截器-全局异常-json数据处理 1. JSR303 2. JSR303中含有的注解 3. spring中使用JSR303进行服务端校验 3.1 导入依赖包 3.2 添加验证规则 3.3执行校验 3.4 错误信息的展示 4. SpringMVC定义Restfull接口 5.1 增加spring配置 5.2 Controller 5.3 格…