Spring Boot 2.7.17+Gradle+jOOQ生成代码时H2精度错误求助
场景描述
为修复旧版本CVE漏洞升级到Spring Boot 2.7.17,执行gradlew generateJooq命令时触发H2数据库错误:
Precision("2147483647")必须在1到1000000000之间
Spring Boot 2.6.0版本下执行相同操作无此问题。
原因分析
Spring Boot 2.7.x默认升级了H2数据库版本(从2.6.x的1.4.x系列升至2.1.x及以上),H2 2.x对数值类型的精度限制更严格,而jOOQ在生成代码时,可能将部分字段(比如对应Java Integer类型的数据库字段)的精度设置为2147483647,刚好超过H2 2.x允许的最大值(1000000000),从而触发报错。
解决思路
调整jOOQ生成配置,限制精度范围
在build.gradle的jOOQ插件配置中,针对出现问题的字段设置精度映射,或全局调整H2的精度处理规则:jooq { configurations { main { generator { database { // 针对特定字段强制设置精度 forcedTypes { forcedType { name = "INTEGER" expression = ".*your_problem_column.*" // 替换为实际出问题的字段名 precision = 10 } } // 全局设置H2允许的最大精度 properties { property { key = "org.jooq.meta.h2.H2Database.maxPrecision" value = "1000000000" } } } } } } }降级H2数据库版本到兼容版
若暂时无法调整jOOQ配置,可在build.gradle中强制指定H2版本为Spring Boot 2.6.x使用的旧版本(如1.4.200):dependencies { constraints { implementation("com.h2database:h2") { version = "1.4.200" } } }注意:降级H2可能引入其他兼容性风险,需完成充分测试。
修正数据库DDL脚本中的字段定义
检查你的DDL脚本,确认是否存在精度超过1000000000的字段定义(比如DECIMAL(2147483647, 0)这类不合理设置),直接修正为符合H2 2.x要求的精度值(例如DECIMAL(18, 0))。升级jOOQ版本到兼容Spring Boot 2.7.x的最新版
Spring Boot 2.7.x默认的jOOQ版本可能存在与H2 2.x的兼容性问题,尝试升级jOOQ到更高版本(如3.18+),在build.gradle中覆盖版本:ext { set('jooqVersion', '3.18.6') }升级前需确认jOOQ版本与Spring Boot 2.7.x的兼容性,可参考官方依赖版本矩阵。
内容的提问来源于stack exchange,提问作者abdel

