news 2026/7/5 2:26:52

死磕Spring Boot Validation校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
死磕Spring Boot Validation校验

一、基本介绍

SpringBoot提供了方便的validation主要对输入数据进行校验,确保数据符合预期规则,是保证应用健壮性的重要手段,
1、Bean Validation:基于 JSR-380 (Bean Validation 2.0) 规范、
2、Hibernate Validator:最流行的实现
3、Spring 集成:通过 @Valid 或 @Validated 注解触发验证
怎么使用就不介绍了,包含如何自定义注解进行校验,分组验证,处理验证错误

二、javax.validation

这里项目jdk为1.8,所使用的包名为javax.validation,之后的版本变更为jakarta.validation
这个包为Jakarta EE平台的基础核心包之一,提供验证bean标准的API,
总入口为Validation类,作为标准的api,需要暴露接口供其他包进行接入,接口为ValidationProvider


ValidationProvider通过ValidationProviderResolver进行处理,除此之外,javax.validation提供了默认的处理器DefaultValidationProviderResolver
会通过SPI机制ServiceLoader加载META-INF/services/
如果未加载到则会抛出异常,否则会取第一个ValidationProvider


最终通过configure生成javax.validation.Configuration
Configuration也提供了非常多的接口层定义,需要实现buildValidatorFactory,再通过ValidatorFactory.getValidator进行校验
javax.validation提供了一些基础的校验注解,具体校验规则也需要单独实现

三、hibernate实现

首先在META-INF/services目录下申明javax.validation.spi.ValidationProvider为org.hibernate.validator.HibernateValidator


HibernateValidator生成的configuration为HibernateValidatorConfiguration


ValidatorFactory的实现为ValidatorFactoryImpl
其中含有几个重要的属性

1、ConstraintValidatorFactory

负责ConstraintValidator的创建和生命周期,通过工厂获取某个校验的ConstraintValidator实例,如果是spring项目,使用的是SpringConstraintValidatorFactory有springframework负责实现

2、校验逻辑

直到开始校验时才会执行Validator.validate方法


这里以分组校验对象为例,Validator也提供了很多种灵活的校验,包括校验单独的某个属性
其中BeanMetaData主要通过AnnotationMetaDataProvoder进行注解的元数据获取,主要思路为根据constraintHelper.isConstraintAnnotation是否当前类含有校验属性的注解Constraint.class,因为基本上每个校验注解里面都有@Constraint
如果没有任何约束条件,则会直接结束,同时,BeanMetaData进行了缓存,下一次校验同类型的时候直接从缓存获取metaData
紧接着会对校验的组进行排序,每次校验可以支持单个或者多个,如果未指定,默认是javax.validation.groups.Default
最后会执行validateInContext进行校验,其中短路验证shouldFailFast,是hibernate专有的,如果开启了这个属性,遇到验证失败的则会直接结束,不再往下执行
这里就会用到提供的接口所有实现ConstraintValidator,调用isValid方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 3:58:51

快速替换文本中的上下标

假设需要对H2O中的2加下标,直接在替换栏中使用下标快捷键会将整个H2O都变成下标,此时需要先复制正确的H2O(即2已经是下标的那种),然后在“查找内容”中输入需要被替换的(比如H2O),在…

作者头像 李华
网站建设 2026/7/4 2:58:26

项目包含项目源码、项目文档、数据库脚本、软件工具等资料;

项目介绍由于传统依靠微信小程序的小区物业管理系统在信息管理上存在很大难题,比如操作困难,容错率低,管理人员处理数据的效率较低等情况,于是便开发出了这个依托微信小程序的小区物业管理系统。 该系统被引用来有目的地解决前面提…

作者头像 李华
网站建设 2026/7/3 9:58:08

key 为出现的数字, value 为该数字出现的次数。遍历⾥⾯所有的数字,如果 hashmap 中存在,那么 value (次数)+1,如果 hashmap 中不存在,那么 value 置为1。

遍历完成之后,需要将次数为 1 的数字捞出来,同样是遍历 hashmap ,由于只有两个满⾜条件,我们设置⼀个标识变量,初始化为1,如果找到第⼀个满⾜条件的数字,除了写⼊放回数组中,还需要将…

作者头像 李华
网站建设 2026/7/4 2:51:53

.算数操作符

移位操作符 使用条件&#xff1a;只能对于 int类型 使用&#xff0c;无符号整型这里算作正数。移位操作符移动的位数不能为负数&#xff0c;标准未定义这种写法&#xff0c;所以在不同编译器中有不同结果 a.<< 左移 对整数的补码左移一位 左边丢弃&#xff0c;右边补零…

作者头像 李华