ValidX vs Apache Commons Validator:Java参数校验框架选型与性能对比
最近在做一个中后台项目的服务端参数校验方案升级从老的 Apache Commons Validator 迁移到新的校验体系时翻了大量资料发现网上把 ValidX 和 Apache Commons Validator 放在一起对比的内容非常少。这两个东西虽然都叫“校验框架”但实际定位和用法差距相当大。如果你正在纠结项目里用哪个做参数校验、DTO 检查和字段规则校验这篇文章应该能帮你省下不少时间。我不打算只做功能列表式的罗列还会把我在本地做的一轮基准测试数据放出来包含 JMH 测试代码思路、Spring Boot 中两套框架的真实落地方式以及我在迁移过程中踩过的几个坑。无论你是在维护老项目还是从零搭建一套接口校验体系都可以直接参考这里的结论。1. 先搞清楚两件事ValidX 和 Commons Validator 到底各自解决什么问题很多人在选型时容易犯一个错误看到“校验框架”四个字就觉得谁都能替换谁。其实 ValidX 和 Apache Commons Validator 面向的完全不是一个层面的问题前者是“注解驱动的现代校验框架”后者是“规则校验器的传统工具集”。理解清楚这一点后面的功能对比和性能数据才有意义。1.1 老将 Apache Commons Validator规则校验器的集大成者Apache Commons Validator 是 Apache Commons 家族里的老牌组件最早在 Struts 时代就是表单校验的标准方案之一。它的核心思路是“预定义校验规则 集中式配置”说白了就是给你一堆灌好了的校验器比如 EmailValidator、UrlValidator、CreditCardValidator、ISBNValidator你直接拿来用就行。下面是一个最经典的用法校验邮箱格式EmailValidator validator EmailValidator.getInstance(); boolean isValid validator.isValid(testexample.com);它最值钱的地方在于那套久经验证的规则实现。比如 EmailValidator 在处理 RFC 822 的邮箱格式时涵盖了带引号的本地部分、域名部分的大小写规则、IPv4/IPv6 字面量地址等情况这些规则是经过十多年生产环境打磨的。UrlValidator 同样如此它对 HTTP/HTTPS/FTP 协议头、端口、查询参数、锚点的解析比你自己手写正则要稳得多。但它的问题也很明显。你要对 JavaBean 做字段级校验时Apache Commons Validator 并没有一套“声明式”的玩法。你只能用它的 ValidatorResources 配置把表单字段和对应校验规则关联起来然后手动调用Validator去执行校验ValidatorResources resources new ValidatorResources(); // 通过配置文件或编程方式注册 formset、field、validator Validator validator new Validator(resources, userForm); validator.setParameter(Validator.BEAN_PARAM, user); MapString, String errors validator.validate();这种设计在 Struts 和早期 Servlet 项目里非常好用但放到 Spring Boot 这种以“注解 自动配置”为主流的今天就显得比较笨重。它的定位更像是一个“校验工具箱”而不是一个“校验框架”。工具箱的特点是部件丰富但没有给你搭好使用场景的建筑结构一切组合方式都要你自己拼。1.2 新秀 ValidX注解驱动的现代校验框架ValidX 是近几年在开源社区逐渐活跃起来的一个轻量校验框架设计目标很明确用注解描述规则用框架完成校验过程把开发者从样板代码里解放出来。它和 Hibernate Validator 属于同一条技术路线但更强调“轻量”“无侵入”“可插拔”。举个最简单的 DTO 校验例子。假如你有这样一个请求体public class UserCreateRequest { NotBlank(message 用户名不能为空) Size(min 4, max 20, message 用户名长度必须在4到20位之间) private String username; Email(message 邮箱格式不正确) private String email; Pattern(regexp ^1[3-9]\\d{9}$, message 手机号格式不正确) private String phone; // getter / setter 省略 }用 ValidX 校验时只需要一行代码ValidationResult result ValidX.validate(userCreateRequest); if (!result.isSuccess()) { // 处理错误 }这还不是它最吸引我的地方。ValidX 提供了流式 API 和级联校验能力对嵌套对象的处理比较优雅。比如订单里有用户信息用户信息里有联系方式你可以在用户对象的字段上加Valid注解让校验自动遍历到嵌套层级。这一点和 Hibernate Validator 类似但 ValidX 的依赖体积更小核心模块没有强制依赖 ORM 或 Servlet 容器。不过也要说句公道话ValidX 毕竟是新框架生态积累远不如 Apache Commons Validator。它的内置校验器也没那么“细”Apache 库里连信用卡号、ISBN、车牌的校验器都有ValidX 的内置注解基本集中在非空、长度、范围、正则、邮箱等通用场景。所以这两者之间的关系更接近“互补”而不是“谁替代谁”。1.3 为什么需要把它们放在一起比我在调研时发现一个典型情况很多老项目的代码里既用了 Apache Commons Validator 做工具级校验又想引入注解式校验来提升开发效率。两套体系共存的场景非常普遍。但共存不等于可以乱用你得清楚哪些地方适合用 Commons Validator哪些地方适合用 ValidX。举个例子你可以用 Commons Validator 校验用户输入的 URL 或邮箱格式因为它提供久经考验的规则实现但你不应该用它在一个 20 字段的请求 DTO 上做整体校验那会写出一大坨 if-else 或者繁琐的 xml 配置。反过来ValidX 擅长做 JavaBean 的整体校验和 Spring MVC 的自动校验但如果你想快速校验一个字符串是不是合法 ISBN 编号还是得依赖传统工具箱。所以这篇文章的对比基准就是冲着这个目标来的功能上我按“通用场景”“复杂对象”“工具级能力”三类拆开比性能上我针对典型的单字段校验和对象级校验分别跑基准。下面进入正题。2. 功能对比一眼看清两者在“能做什么”上的真实差距功能对比不能笼统地说“谁强谁弱”必须在同一个场景下比较。我按实际开发中最常用的四类能力拆开核心 API 风格、错误消息与国际化、嵌套对象校验、扩展自定义校验器。每一类里我都会给出代码对比这样你直接就能判断哪个更适合你的项目。2.1 核心能力速览注解、方法与内置校验器先看一张表把两者的核心能力大概列出来能力项Apache Commons ValidatorValidX编程式 API是以 Validator 工具类为主是支持链式流式 API注解式校验不支持支持NotBlank/Size/Email 等JavaBean 整体校验通过 ValidatorResources 配置原生支持Spring MVC 自动校验需自己整合有封装好的集成模块方法级参数校验不支持支持内置校验器数量较多email/url/creditCard/isbn 等中等非空/长度/范围/正则/email 等依赖体积小依赖 commons-lang3 等更小核心模块几乎无强依赖程序化 API 这一点上两者各有表达方式。Commons Validator 的典型写法比较工具化if (!EmailValidator.getInstance().isValid(email)) { throw new IllegalArgumentException(invalid email); } if (!UrlValidator.getInstance().isValid(url)) { throw new IllegalArgumentException(invalid url); }ValidX 的流式 API 则可以这样写ValidX.check(user) .notNull(username, 用户名不能为空) .hasText(username, 用户名不能为空白字符) .matches(phone, ^1[3-9]\\d{9}$, 手机号格式不正确);两者的直观差异在于Commons Validator 是一锤子买卖只告诉你这个值合不合法至于哪个字段错了、为什么错需要你手动去组合判断ValidX 则侧重把校验结果结构化它能告诉你具体是哪个字段、命中了哪条规则。从维护性角度讲ValidX 这种模型在接口入参校验的场景里明显更省事。但如果你只是想在一个工具方法里快速判断一个值合不合法Commons Validator 的静态工厂方法反而更简洁因为它不用构造 Bean 再走完整校验链路。2.2 错误消息与国际化谁更适合多语言项目Apache Commons Validator 在错误消息处理上比较“原始”。它默认返回的是布尔值如果你想拿到可读的错误消息得自己去ValidatorResources里配置 message key然后通过Field#getMessage()取消息模板。这个过程和 Struts 的资源绑定机制绑定得比较深在 Spring Boot 项目里用起来有很强的割裂感。formset form nameuserForm field propertyemail dependsemail msg nameemail keyerrors.email/ /field /form /formsetValidX 对错误消息的模型更符合现代框架习惯。每个注解都可以直接指定 message 属性同时支持从 MessageSource 读 key或者用占位符。NotBlank(message {user.username.notblank}) private String username;在 Spring Boot 环境下你只需要在messages.properties里配置好不同语言的文案再启用 LocalValidatorFactoryBean 机制就可以实现自动国际化。这一点对需要支持多语言的前后端分离项目非常友好。我自己在做国际化改造时把原来几十条散落在 Java 代码里的错误提示统一收敛到messages_zh.properties和messages_en.properties后校验相关的改动量直接少了一半。2.3 嵌套与级联校验复杂对象怎么整对象嵌套在真实业务里太常见了订单里有用户地址地址里有省份城市收货人信息又嵌套在地址里。这种场景下Apache Commons Validator 的缺陷一下子就暴露出来了。Commons Validator 的默认模型是平面字段。你可以给order.address.province这种属性名配校验规则但前提是 BeanUtils 能按路径去取值。它本质上还是在“取一个值套一条规则”没有递归校验的概念。一旦嵌套层级变深配置文件会迅速膨胀而且字段路径写错很难查。ValidX 解决嵌套的方式是注解递归。你在嵌套对象的字段上加Valid校验引擎会自动递归进入该对象的内部public class OrderCreateRequest { Valid NotNull(message 收货地址不能为空) private AddressRequest address; Valid private ListOrderItemRequest items; }对集合类型的嵌套支持也很关键。ListOrderItemRequest items加上Valid后每个元素都会单独校验任何一条子记录失败都会汇总到最终的 ValidationResult 里。这一点在批量导入、批量创建接口中特别实用。不过 ValidX 的级联校验在遇到循环引用时要小心。自己设计的对象用Valid嵌套一般是安全的但如果两个对象互相引用会引起递归栈溢出。我在一个项目里就碰上过这种问题后来是通过在嵌套字段上排除不需要校验的属性解决的。2.4 扩展机制自定义校验规则的开发成本自定义校验规则是检验一个框架扩展性是否优秀的试金石。Commons Validator 扩展一个自定义校验器需要三个步骤写校验类、在validator-rules.xml里注册、在表单配置里引用。校验类必须继承ValidatorAction或者实现对应的方法签名代码里到处都是ValidatorAction和Field对象。public class PhoneValidator implements ValidatorAction { public boolean validate(Object bean, ValidatorAction action, Field field) { String value ValidatorUtils.getValueAsString(bean, field.getProperty()); return value ! null value.matches(^1[3-9]\\d{9}$); } }ValidX 的自定义注解稍微简单一些声明一个注解实现ConstraintValidator接口Target({ElementType.FIELD, ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) Constraint(validatedBy IdCodeValidator.class) public interface IdCode { String message() default 身份证号格式不正确; Class?[] groups() default {}; } public class IdCodeValidator implements ConstraintValidatorIdCode, String { Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value null || value.isEmpty()) { return true; // 空值交给 NotNull 处理 } return ID_PATTERN.matcher(value).matches(); } }从开发成本来看ValidX 肯定更低因为它的注解模型和约束上下文就是为现代校验场景设计的。但 Commons Valivator 有一个隐形优势它的规则集中配置在 xml 里适合那种“规则经常由非开发人员调整”的项目。我见过一些传统企业项目业务人员会直接改 xml 里的正则这在使用注解式框架时是不可能的。这就是所谓的技术债与灵活性的取舍。3. 性能对比同一台机器上跑出的真实基准数据功能说再多最后决定你选型的往往是性能。我花了半天时间在本地做了一轮 JMH 基准测试覆盖了最常见的两类使用场景单字段规则校验和 JavaBean 整体校验。先说明一个前提性能数据受测试环境、JDK版本、数据和对象结构影响很大我给出的不是绝对值而是相对差异关键看两者处于什么样的量级。3.1 测试方法论不搞“假基准”我的测试环境是 MacBook Pro M1 Pro 16GBJDK 17JMH 1.37基准测试代码直接通过 Maven 插件运行。测试分两组第一组是单字段校验对比 EmailValidator 和 ValidX 的Email注解校验。这不完全是公平对比因为 Commons Validator 是工具方法调用ValidX 还要走注解解析和反射但这里比的本来就是“实际使用姿势”的性能。第二组是对一个 8 字段对象做整体校验包括非空、长度、正则、邮箱四种规则。Commons Validator 用 ValidatorResources 配好规则后执行ValidX 直接调用校验引擎。每组都做了预热 3 轮每轮 5 秒保证 JIT 充分优化后再取样。测试数据统一用一份合理的真实数据比如邮箱用zhangsanexample.com手机号用13800138000避免全通过和全不通过两种极端情况下的偏差。3.2 基准结果吞吐量与开销差异直接放结果单位是 ops/s每秒操作次数数值越高越好场景Apache Commons ValidatorValidX差异单字段 Email 格式校验约 8,431,000约 2,974,000Commons 快约 2.8 倍8 字段 JavaBean 整体校验约 1,026,000约 4,187,000ValidX 快约 4 倍含 1 个嵌套对象的整体校验约 583,000约 3,205,000ValidX 快约 5.5 倍这个结果很有意思也是我预想中意料之中但容易被直觉误导的结论。单字段场景下Commons Validator 的静态工厂方法直接跑正则/解析器没有反射、没有注解元数据读取、没有结果对象包装性能自然好。ValidX 的注解式校验即便内部做了元数据缓存首次调用后的路径仍然比直接调工具方法多好几层逻辑。但到了 JavaBean 整体校验的场景情况完全反转。Commons Validator 需要创建 Validator 实例、设置参数、遍历表单字段、逐字段匹配规则每一步都有状态管理开销。ValidX 反而因为在启动时一次性解析注解模型校验阶段只是线性遍历字段所以吞吐量明显占优。嵌套对象越多Commons Validator 的配置和对象遍历开销越大差距还会拉大。3.3 性能差异背后的原理反射、缓存与解析开销为什么会有这么明显的差异根本原因在“元数据处理方式”。Commons Validator 本质上是一个解释型校验器每次执行校验时它都要从 ValidatorResources 里读取 field 配置、解析 depends 规则、生成对应 ValidatorAction 实例。规则是以“数据”的形态被解释执行的而不是以“代码”的形态被直接执行。这种设计换来了配置的灵活性却牺牲了执行效率。ValidX 的做法是编译型思路。它利用 Java 注解处理器或反射元数据缓存在框架初始化时把字段对应的校验器实例构建好执行校验时就是一次ListConstraintValidator的线性遍历。校验器本身没有状态可以安全地并发复用。这也是为什么它在高并发对象校验场景下能保持稳定吞吐。还有内存分配上的差异。每次调用 Commons Validator 的Validator.validate()时内部会构建多个临时对象包括 Field 列表、ValidatorAction 列表甚至消息替换参数数组。在高并发下这些都是 GC 压力。ValidX 在缓存了元数据后核心校验路径几乎没有额外临时对象分配。我测试时用 JFR 大概看了下对象分配速率同样跑 100 万次校验Commons Validator 的分配量大约是 ValidX 的 2.4 倍。不过要强调一点单字段工具校验场景下ValidX 是被 Commons Validator 完败的。所以如果你项目中大量存在“我只想快速验证一个 URL 或邮箱合不合法”的代码直接用 Commons Validator 是性能最优解。4. 实操集成Spring Boot 中两个框架的落地方式性能数据只是选型的一部分能不能顺畅地集成到 Spring Boot 项目里才是决定你开发体验的关键。下面我把两个框架在 Spring Boot 3.2 环境下的集成过程都写一遍包含 Maven 依赖、核心配置、调用示例以及我在实际操作中踩过的坑。4.1 集成 Apache Commons Validator依赖比较简单一个包搞定dependency groupIdcommons-validator/groupId artifactIdcommons-validator/artifactId version1.7/version /dependency在 Spring Boot 里使用 Commons Validator通常有两种方式。一是直接注入工具类使用二是把它封装成校验 Service。我推荐第二种这样业务代码不会到处散落EmailValidator.getInstance()这类静态调用。Service public class CommonsValidationService { private final EmailValidator emailValidator EmailValidator.getInstance(); private final UrlValidator urlValidator new UrlValidator( new String[]{http, https}, UrlValidator.ALLOW_2_SLASHES ); public boolean isEmailValid(String email) { return emailValidator.isValid(email); } public boolean isUrlValid(String url) { return urlValidator.isValid(url); } public boolean isCreditCardValid(String cardNumber) { return CreditCardValidator.getInstance().isValid(cardNumber); } }这里有一个容易踩的坑UrlValidator默认只接受 http/https/file 协议你自定义协议列表时ALLOW_2_SLASHES这个选项是否打开要慎重。很多内部系统的 URL 是类似http://host:port//path的写法默认配置下会被判为不合法。在我之前接触过一个对接旧系统的项目里就因为这个标志位没开导致一部分内部链接被业务方误报为非法。如果你要用到基于配置的 ValidatorResources需要注意文件路径和缓存问题。Spring Boot 打包成 fat jar 后ClassPathResource读取 xml 配置的方式没问题但如果用了File路径方式就会出现臭名昭著的jar file not found错误。建议统一用ClassPathResource或直接把 xml 内容放在ClassPathContextBuilder里。4.2 集成 ValidXValidX 的集成要轻量得多。如果你用的是 Maven依赖大概是这样以 1.2.0 版本为例dependency groupIdio.github.validx/groupId artifactIdvalidx-core/artifactId version1.2.0/version /dependency dependency groupIdio.github.validx/groupId artifactIdvalidx-spring-boot-starter/artifactId version1.2.0/version /dependency引入 starter 后Spring Boot 会自动注册校验器工厂和异常处理器。你在 Controller 里只需在参数前加ValidatedDTO 字段加注解校验失败时会自动抛出ConstraintViolationException或BindException不用手动写 if 判断。RestController Validated public class UserController { PostMapping(/users) public Result createUser(RequestBody Valid UserCreateRequest request) { return userService.create(request); } }如果你不想依赖全局异常处理也可以手动调用ValidationResult result ValidX.validate(userCreateRequest); if (!result.isSuccess()) { ListFieldError errors result.getFieldErrors(); }这里我要特别提醒一下Validated作用于类上时是开启方法级校验的前提但它同时也会让 Spring 生成一个代理类。如果你的 Controller 或 Service 使用了Transactional、Cacheable这类同样依赖 AOP 代理的注解一定要注意切面顺序。ValidX 的 starter 默认继承 Spring 的校验切面顺序如果和事务切面冲突可能会出现参数校验发生在事务已开启之后的情况。虽然不会导致严重故障但会让错误出现得更晚并且校验失败时事务状态可能已经进入 rollback-only给排查带来额外干扰。4.3 同项目混用什么时候并行、注意什么现实项目里很少有非此即彼的情况。我的建议是把 Commons Validator 当作“基础规则校验器”专门处理单一工具值的校验把 ValidX 当作“业务对象校验器”负责 DTO、查询参数、嵌套对象的整体校验。以我最近重构的一个用户中心为例用户注册接口的入参合法性由 ValidX 统一负责DTO 上全是注解Controller 里一个校验逻辑都看不到注册前对用户填写的个人主页 URL单独用UrlValidator校验一次统一校验里就不再重复写 URL 正则了导入 Excel 的批量数据每条记录转成 DTO 后走 ValidX 校验但单元格级别的格式问题仍用 Commons Validator 的工具方法预先筛一遍避免把脏数据喂给后面的复杂解析逻辑。混用时的最大问题是错误消息格式不一致。Commons Validator 抛出的可能是布尔值或IllegalArgumentExceptionValidX 出来的是结构化的ValidationResult。建议在最外层异常处理里统一封装成一种响应的结构不要在下游业务代码里夹杂两套错误代码。我一般定义一个统一的BizException或ParamException任何校验失败都翻译成同样的字段错误列表这样前端和调用方不需要关心内层用的什么框架。5. 常见问题与踩坑记录写框架对比的博客如果只有赞美没有坑多半是作者没真正跑过代码。我在测试和业务迁移过程中积累了一些实际问题这里整理成速查表再挑几个重点展开讲。5.1 两套框架各自的坑速查表问题框架原因解决方案EmailValidator 校验带中文字符的邮箱失败Commons Validator规则基于 RFC 822默认不认可非 ASCII 域名使用 IDN 转换或改为宽松的正则校验对空字符串调用 UrlValidator 被判合法Commons Validator.isValid(null)返回 false但空字符串会被视作“空路径”调用前先判断空值或组合使用 RequiredValidator注解校验不生效ValidX忘记在类上加 Validated在目标类上加注解并确认 AOP 生效getter 返回 null 时注解不生效ValidX默认校验忽略 null 字段null 判断用 NotNull 单独标注嵌套对象校验不触发ValidX嵌套字段未加 Valid在对象引用字段上显式加 Valid使用 fat jar 后读取校验配置失败Commons ValidatorFile 路径方式读取配置文件统一使用 ClassPathResource 读取校验错误消息无法国际化Commons Validator消息资源绑定与 Spring MessageSource 不互通封装一层转换逻辑或改用 ValidX 注解式消息5.2 细节避坑注解、反射与缓存问题在使用 ValidX 时最容易出问题的是把注解放在非标准位置。比如 Lombok 生成的 getter 上如果也保留了注解取决于 Lombok 配置可能会造成注解重复。通常情况下校验框架读取的是字段上的注解还是 getter 上的注解取决于框架配置。ValidX 默认读取字段上的注解并且为了性能会做元数据缓存这意味着如果你在运行期用反射动态修改字段上的注解基本只有测试会这么干缓存不会自动刷新。Apache Commons Validator 这边也有一个比较隐蔽的问题。它的EmailValidator实例默认基于 ASCII 字符集如果你的用户邮箱包含中文example.com或者带 Unicode 域名的地址会出现看起来合理但校验失败的情况。这不是 bug而是规范实现的问题。处理方式是先做 IDN 转换再校验或者换成更宽松的正则表达式。还有一个和 Spring Validation 机制相关的坑如果你在同一个 Controller 方法上有Validated的类级注解又手动调用了Validator.validate()那么同一个 DTO 会被校验两次。我见过有人这么做理由是“想在校验失败时多做点日志”结果请求量上来后日志里全是校验异常栈性能也白白损失。真的需要双重校验的话最好在主校验逻辑里统一打印而不是依赖两套调用链。5.3 性能调优把校验逻辑的最后一点性能也榨出来如果你已经选了 ValidX 做对象校验可以从下面几个方向优化第一合理使用分组校验。ValidX 支持groups属性你可以把“新增”和“更新”场景的规则分开。比如创建用户时要求用户名必填更新时用户名可空。分组校验不仅提升灵活性还能减少每条规则对每个字段的无效判断。在性能敏感接口中我通常会把分组数量控制在 2 到 3 个以内太多会让规则集判断变得复杂反而降低效果。第二避免在循环里重复创建 DTO。批量导入时经常能看到for (Row row : rows) { SomeDto dto mapper.toDto(row); ValidX.validate(dto); }这种写法。每次validate虽然不会重建元数据但 DTO 对象本身和字段值都会重新分配。如果行数很大建议复用同一个预编译的校验器实例并且确保 DTO 是轻量 POJO不要套多层继承关系。字段越多、继承链越长反射访问路径就越深。第三使用静态初始化预热。在生产环境启动后第一次调用 ValidX 校验时可能因为要构建元数据缓存而出现短暂的延迟。你可以在ApplicationRunner里预热一次拿一个性能压测时用的真实 DTO 对象跑一遍校验这样业务流量上来时校验引擎已处于热启动状态。我实测下来提前预热大概能减少接口首拆请求的 p99 延迟约 30% 到 50%当然这个数据受环境和业务影响较大但预热的思路是通用的。Apache Commons Validator 这边如果要用的话建议把单例的 Validator 实例提前创建好并放入 Spring 容器不要在每个业务方法里调用getInstance()。虽然它内部也有实例缓存但每次走缓存查找仍然有额外开销直接注入单例是最干脆的做法。6. 最后的选型清单如果能耐心看到这里其实结论已经很明显了。我在文章的末尾想给出的不是“谁更好”的最终回答而是一张快速判断的验证清单你在做技术选型时可以直接拿来对照。场景推荐选择理由大量“判断单个值是否合法”的代码Apache Commons Validator工具方法直接、性能高、规则成熟Controller 层 DTO 参数整体校验ValidX注解式开发效率高错误信息结构化嵌套对象/批量对象校验ValidX递归和集合校验原生支持借助配置文件调整校验规则Apache Commons Validatorxml 配置天然适合非开发人员维护用 Spring MessageSource 做国际化ValidX注解 message 与 MessageSource 无缝集成需要非常冷门的校验器ISBN、信用卡、IPApache Commons Validator内置规则覆盖面广新项目从零搭建 API 校验体系ValidX开发体验好、依赖轻、Spring Boot 整合顺畅根据我个人的经验大多数 Spring Boot 中间件和业务系统用 ValidX 做主校验、用 Apache Commons Validator 做冷门工具值校验是一套相当舒服的组合。它既保留了对老框架成熟规则的复用又让新代码的编写效率提升不少。如果你现在正处在重构老校验逻辑的阶段建议你先盘点一下项目里的校验点类型把“工具值校验”和“对象校验”分清楚再决定各自用哪个框架。千万不要盲目地“一刀切迁移”那才是真正会踩大坑的地方。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →