当前位置: 首页 > news >正文

死磕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方法

http://www.cnnetsun.cn/news/3076320.html

相关文章:

  • 一句话讲透向量数据库:它把“语义相似“变成了可计算的东西
  • 快速替换文本中的上下标
  • 项目包含项目源码、项目文档、数据库脚本、软件工具等资料;
  • 2024年最全Minecraft矿石透视模组指南:Advanced XRay从零配置到高效挖矿
  • key 为出现的数字, value 为该数字出现的次数。遍历⾥⾯所有的数字,如果 hashmap 中存在,那么 value (次数)+1,如果 hashmap 中不存在,那么 value 置为1。
  • .算数操作符
  • AI编程Token成本将与开发者薪资持平,企业如何应对?
  • 报错解决org.springframework.web.method.annotation Failed to convert value of type ‘java.lang.String‘ to
  • ESP32 + 传感器:手把手教你做土壤监测终端
  • 微信小程序:农户手机上的「农场管家」
  • 自动灌溉系统:AI 什么时候浇水,比老农还准?
  • 批量处理远程共享目录中的特定类型文件(如 .hex、.csv 等)。
  • OpenGL学习笔记-05-着色器-数据类型/输入输出/uniform
  • 基于OpenCV与YOLO的实时目标检测系统搭建指南
  • Docker部署PostgreSQL
  • Playwright混沌工程实战:构建AI增强的韧性Web自动化测试体系
  • 【LeetCode】反转字符串
  • 京东开源实时视频视觉语言交互模型:全栈方案解析与落地实践
  • 智能体颠覆安全-360图龙锋如何用蜂群路线打造中国版Mythos
  • Java 26 发布了, 我人麻了。。
  • 玩三角洲要高配?2026年这5款旗舰游戏本让你杀穿新赛季
  • AI模型门控发布机制解析:原理、实践与行业应用
  • 2026全球EMBA客观测评:科学选型与优质项目解析
  • 工程师转型AI:从跑通Demo到收藏实战秘籍,拒绝高数劝退!
  • 微信聊天记录备份终极指南:如何安全保护你的数字记忆
  • UMDF驱动开发入门:二 详解INF文件与设备类选择
  • 软件测试——黑盒测试
  • AI Agent 三种记忆的工程落地
  • 网络安全事件报告——伪CAPTCHA诱骗用户运行危险的PowerShell脚本
  • 小白可懂的保姆级 Redis 教程