如何自定义jOOQ生成的RowMappers?OffsetDateTime与Instant映射异常问题咨询
我在使用 jOOQ 代码生成功能时,遇到了自定义 Converter 无法在 vertx 模块生成的 RowMappers 类中生效的问题,具体情况和排查过程如下:
问题场景
我实现了一个双向 Converter,用于完成 OffsetDateTime 与 Instant 之间的映射转换。这个 Converter 在生成的 Table、Pojo、Record 定义中都能正常工作,但在 jooq-vertx 库生成的 RowMappers 类里却失效了。
生成的 RowMappers 关键代码片段如下:
public static Function<Row,com.redhat.runtimes.data.access.tables.pojos.Todos> getTodosMapper() { return row -> { com.redhat.runtimes.data.access.tables.pojos.Todos pojo = new com.redhat.runtimes.data.access.tables.pojos.Todos(); pojo.setId(row.getUUID("ID")); pojo.setTitle(row.getString("TITLE")); pojo.setDescription(row.getString("DESCRIPTION")); pojo.setCreated(row.getInstant("CREATED")); pojo.setDueDate(row.getInstant("DUE_DATE")); pojo.setComplete(row.getBoolean("COMPLETE")); pojo.setAuthor(row.getString("AUTHOR")); return pojo; }; }
这里的核心问题是:Row 对象并没有 getInstant() 方法,理想情况下生成的代码应该调用 DateTimeConverter.from(row.getOffsetDateTime("<field>")) 来复用我的自定义 Converter,但实际生成的代码并没有这么做,直接导致编译失败。
排查与尝试
- 最初在 Maven 输出中发现了代码生成器的访问提示,曾推测这是 RowMappers 失效的根源:
[INFO] 'com.redhat.runtimes.data.access.converters.UUIDConverter' to map 'java.util.UUID' could not be accessed from code generator.
[INFO] 'com.redhat.runtimes.data.access.converters.UUIDConverter' to map 'java.util.UUID' could not be accessed from code generator.
[INFO] 'com.redhat.runtimes.data.access.converters.DateTimeConverter' to map 'java.time.Instant' could not be accessed from code generator.
[INFO] 'com.redhat.runtimes.data.access.converters.DateTimeConverter' to map 'java.time.Instant' could not be accessed from code generator.
我已经通过在 jOOQ Maven 插件的依赖中添加转换器模块的依赖,解决了上述代码生成器无法访问转换器的错误,但 RowMappers 类仍然编译失败。
经过确认,RowMappers 和 DAOs 是由 jooq-vertx 库生成的,我计划直接联系该库的维护者 Jan Klingsporn 咨询相关建议。
临时绕过方案
在等待官方回复期间,可以尝试以下临时方案缓解问题:
- 手动修改生成的 RowMappers 代码,将
row.getInstant()调用替换为通过自定义 Converter 转换的逻辑,但这种方式每次代码生成后都需要重新修改,不够优雅。 - 尝试在 jOOQ 代码生成配置中,针对 vertx 生成器单独配置 Converter 的引用,确保生成器能正确识别并应用 Converter。
内容的提问来源于stack exchange,提问作者Deven Phillips

