使用Jooq 3.15.12处理JSON类型时触发NullPointerException
jOOQ 3.15.12生成代码时因MySQL JSON字段触发NullPointerException
使用jOOQ 3.15.12针对MySQL数据库生成代码时,处理包含JSON类型字段的表REGEX时触发NullPointerException,错误发生在表关联关系获取环节。将JSON字段改为其他类型(如TEXT)后,代码生成可正常完成。
错误堆栈信息
Error while generating table ArmourDb.REGEX java.lang.RuntimeException: java.lang.RuntimeException: java.lang.NullPointerException at org.jooq.meta.AbstractDatabase.onError(AbstractDatabase.java:3104) at org.jooq.meta.AbstractDatabase.getRelations(AbstractDatabase.java:2317) at org.jooq.meta.DefaultColumnDefinition.getPrimaryKey(DefaultColumnDefinition.java:100) at org.jooq.meta.AbstractTableDefinition.getPrimaryKey(AbstractTableDefinition.java:91) at org.jooq.codegen.JavaGenerator.generateTable(JavaGenerator.java:5019) at org.jooq.codegen.JavaGenerator.generateTables(JavaGenerator.java:5000) at org.jooq.codegen.JavaGenerator.generate(JavaGenerator.java:582) at org.jooq.codegen.JavaGenerator.generate(JavaGenerator.java:537) at org.jooq.codegen.JavaGenerator.generate(JavaGenerator.java:436) at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:879) at org.jooq.codegen.GenerationTool.run(GenerationTool.java:233) at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:228) at com.linkedin.gradle.mysql.tasks.MySQLJooqCodegenTask.taskAction(MySQLJooqCodegenTask.java:32) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
涉事MySQL表结构
CREATE TABLE REGEX ( ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, WORD VARCHAR(4000) NOT NULL, DESCRIPTION VARCHAR(1000), TRAITS JSON, MODIFIED_BY VARCHAR(255) NOT NULL, MODIFIED_AT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CREATED_AT TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB;
解决方案
- 升级jOOQ版本:jOOQ 3.15.12存在MySQL JSON字段元数据解析的bug,升级到3.16及以上版本可修复该问题。后续版本对MySQL JSON类型的处理逻辑进行了优化,避免了关联关系获取时的NPE。
- 临时规避方案:若暂时无法升级版本,可先将JSON类型字段改为TEXT类型,完成代码生成后再改回JSON类型。需注意此方式仅为临时手段,长期使用可能引发类型不一致问题。
- 确认方言配置:检查jOOQ代码生成配置,确保已正确指定MySQL数据库方言,示例配置片段:
<generator> <database> <name>org.jooq.meta.mysql.MySQLDatabase</name> <!-- 其他数据库配置 --> </database> </generator>
内容的提问来源于stack exchange,提问作者priya
相关产品推荐
相关产品推荐

