Skip to content

fix: 修复配置转换、SQL 方言与 JEXL 配置失效#711

Open
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-config-sql-script-correctness
Open

fix: 修复配置转换、SQL 方言与 JEXL 配置失效#711
zhibeigg wants to merge 1 commit into
TabooLib:dev/6.3.0from
zhibeigg:fix/703-config-sql-script-correctness

Conversation

@zhibeigg

@zhibeigg zhibeigg commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

原有问题

配置转换、SQL 构造和 JEXL 引擎缓存都存在“表面类型或配置已变化,内部仍按旧信息处理”的问题:

  • ObjectConverter 在递归转换集合和映射时丢失声明泛型,嵌套对象可能按原始 Object、错误集合类型或错误元素类型恢复。
  • ActionInsert 在 MySQL、PostgreSQL、SQLite 间复用不兼容的 upsert 语法,空字段、占位符和参数顺序也可能不一致。
  • 表名、列名和索引名未按数据库方言引用,schema 限定名或保留字会生成非法 SQL。
  • JEXL 配置发生变化后仍复用旧引擎,部分运行环境还缺少所需日志依赖。

典型触发场景与后果

  • 配置包含 List<Map<String, Bean>>、Set、Queue、SortedSet 或 EnumSet:读取后出现 ClassCastException、元素类型错误或集合语义丢失。
  • 在 PostgreSQL/SQLite 上执行按 MySQL 生成的重复键更新:直接语法错误;参数顺序不一致时还可能把值写入错误字段。
  • 表名或列名使用保留字、特殊字符、schema:建表、建索引或插入失败。
  • 运行中修改 JEXL strict/silent/cache 等配置:新配置看似已保存,但表达式仍按旧引擎执行;缺失日志类时可能启动失败。

本 PR 修改

  • 按声明泛型递归恢复 Set、Queue、SortedSet、EnumSet、Map 和嵌套对象,并兼容 Kotlin 通配符签名。
  • 按 MySQL、PostgreSQL、SQLite 分别生成重复键更新 SQL,校验空字段及非法结构,保持占位符和参数顺序一致。
  • 对索引、表和列应用方言对应的标识符引用规则,支持 schema 限定表名。
  • 在 JEXL 配置变化后线程安全地失效并重建引擎,补齐 commons-logging 运行时依赖与重定位。
  • 增加嵌套集合转换、SQL 快照、SQLite 实际 upsert 和 JEXL 配置重建测试。

修改目的

让配置声明、数据库方言和运行时脚本配置真正决定最终行为,避免类型漂移、SQL 在不同数据库上失效以及配置修改不生效。

兼容性与行为变化

  • 公开 API 保持不变。
  • 反序列化结果会更准确地遵循字段泛型声明。
  • SQL 文本会按实际数据库方言生成;非法插入结构会更早、明确地失败。

验证

  • ./gradlew :module:basic:basic-configuration:test :module:database:test :module:script:script-jexl:test --rerun-tasks --no-parallel --stacktrace
  • ./gradlew :module:script:script-jexl:test :module:script:script-jexl:shadowJar --rerun-tasks --no-parallel --stacktrace
  • git diff --check
  • 最终只读复审未发现阻塞问题

Refs #703

保留声明集合语义并按数据库方言生成合法 SQL,同时确保 JEXL 配置变更后重建引擎。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant