You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义jOOQ生成的RowMappers?OffsetDateTime与Instant映射异常问题咨询

jOOQ Vert.x RowMappers 未正确应用自定义 Converter 的问题

我在使用 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,但实际生成的代码并没有这么做,直接导致编译失败。

排查与尝试

  1. 最初在 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.

  1. 我已经通过在 jOOQ Maven 插件的依赖中添加转换器模块的依赖,解决了上述代码生成器无法访问转换器的错误,但 RowMappers 类仍然编译失败。

  2. 经过确认,RowMappers 和 DAOs 是由 jooq-vertx 库生成的,我计划直接联系该库的维护者 Jan Klingsporn 咨询相关建议。

临时绕过方案

在等待官方回复期间,可以尝试以下临时方案缓解问题:

  • 手动修改生成的 RowMappers 代码,将 row.getInstant() 调用替换为通过自定义 Converter 转换的逻辑,但这种方式每次代码生成后都需要重新修改,不够优雅。
  • 尝试在 jOOQ 代码生成配置中,针对 vertx 生成器单独配置 Converter 的引用,确保生成器能正确识别并应用 Converter。

内容的提问来源于stack exchange,提问作者Deven Phillips

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:47:46