更新日志
v0.7.0 (2026-03-03)
🐛 问题修复
- 修复
SpelParser线程安全问题:移除静态共享的StandardEvaluationContext,改为每次parse()调用创建新的 context 实例,BeanResolver 通过volatile引用安全共享 - 修复
ObjectValidResult.EMPTY可变单例问题:将EMPTY常量替换为empty()工厂方法,每次返回新实例,避免全局状态污染 - 修复
AnnotationMethodManagernull 缓存失效:使用Optional<Method>作为缓存值,确保不存在的方法查询结果也能被正确缓存,避免重复反射 - 修复
NumberComparatorUtilAPI 设计不一致:将OptionalInt三态替换为语义清晰的CompareResult枚举 - 修复
ResourceBundleMessageResolver并发问题:对addBasenames()和resetBasenames()的读-改-写操作加synchronized互斥锁 - 修复
ConstraintViolationSet集合修改问题:将增强 for 循环中的list.remove()改为迭代器remove() - 修复
SpelNotSupportedTypeException拼写错误:supperType→supportedType
✨ 功能增强
- 优化 SpEL 表达式求值错误提示:
SpelParser.parse()在表达式求值为 null 或类型不匹配时,提供包含表达式内容和期望类型的详细错误信息 - 统一 jakarta/javax 模块差异:
- 移除 javax
SpelValid.message()上不恰当的@NotNull注解 - javax 版
@SpelValid的@Target补充TYPE,与 jakarta 版本保持一致
- 移除 javax
✅ 测试与稳定性
- 新增
SpelParserConcurrencyTest并发回归测试(16 线程 × 1000 次 × 5 轮) - 适配
SpelParserInitTimingTest以匹配新的 SpelParser 内部结构 - 补齐 javax 模块测试用例(
ParentClassTestBean、I18nTestBean)
💥 破坏性变更
ObjectValidResult.EMPTY常量移除,改为ObjectValidResult.empty()方法NumberComparatorUtil的LESS_THAN、GREATER_THAN、FINITE_VALUE常量类型从OptionalInt改为CompareResult枚举;compare()方法的treatNanAs参数类型同步变更SpelNotSupportedTypeException.getSupperType()更名为getSupportedType()
v0.6.2-beta (2026-02-09)
🐛 问题修复
- 修复
ChronoLocalDateTime/ChronoZonedDateTime类型不支持的问题 - 优化
SpelParser初始化时序下的 BeanResolver 绑定行为,降低并行测试下的时序互踩风险
✅ 测试与稳定性
- 新增/补充以下回归测试:
SpelParserInitTimingTestAbstractSpelTemporalValidatorExceptionTest(补充 Chrono 时间语义回归用例)
SpelParserInitTimingTest增加隔离执行注解,避免并发干扰
v0.6.1-beta (2025-12-19)
🎉 新增功能
- 支持在 Kotlin 类上使用
@SpelValid注解,并补充了相关测试用例
🔧 工程调整
- 升级发布相关构建插件,完善版本发布流程
v0.6.0-beta (2025-08-13)
🎉 新增功能
- 新增
@SpelDigits注解:用于校验数字的整数部分和小数部分位数- 支持所有
Number类型及它们的基本数据类型 - 支持使用
CharSequence表示的数字 - 提供
integer和fraction参数分别控制整数和小数部分的最大位数
- 支持所有
✨ 功能增强
@SpelMin和@SpelMax支持CharSequence类型:现在可以对字符串形式的数字进行范围校验@SpelMin和@SpelMax新增inclusive参数:- 支持配置边界值是否包含在内
inclusive = true(默认):@SpelMin验证value >= min,@SpelMax验证value <= maxinclusive = false:@SpelMin验证value > min,@SpelMax验证value < max
本次增强
@SpelMin和@SpelMax的目的,是为了对标@DecimalMax、@DecimalMin两个注解,参考 https://github.com/stick-i/spel-validator/issues/65
💥 破坏性变更
@SpelMin和@SpelMax的value参数改为必填:- 移除了默认值,提高使用的明确性
- 升级时需要为所有使用这两个注解的地方显式指定
value值
⚠️ 升级注意事项
如果你从旧版本升级到 0.6.0-beta,请注意:
- 必须为
@SpelMin和@SpelMax指定value值:// 旧版本(不再支持) @SpelMin private Integer count; // 新版本(必须指定 value) @SpelMin(value = "0") private Integer count;
历史版本
更多历史版本信息请查看 GitHub Releases。
