由于区分大小写,jooq + jackson 无法将 json 转换为 pojo

jooq + jackson fails to convert json to pojo due to case sensitivity

以下代码失败:

    final var account = dc.select(ACCOUNT.asterisk())
            .from(ACCOUNT)
            .limit(1)
            .forJSON().path().withoutArrayWrapper()
            .fetchOneInto(Account.class);

错误信息如下:

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "FIRSTNAME" ... known properties: ... "firstname" ...

Jackson 似乎无法将大写列 FIRSTNAME 映射到 pojo 的小写字段“firstname”(所有其他字段也类似)。我正在使用生成的 类。如何在仍然使用 json 的情况下修复它?

jooq版本是3.16,数据库是oracle

修复 Jackson 映射 use-case

在您的特定查询中,您可以 auto-alias 所有列的小写等效,例如:

final var account = 
    dc.select(Stream
          .of(ACCOUNT.fields())
          .map(f -> f.as(f.getName().toLowerCase()))
          .toList())
      .from(ACCOUNT)
      .limit(1)
      .forJSON().path().withoutArrayWrapper()
      .fetchOneInto(Account.class);

完全避免use-case

但是,鉴于您的特定查询,我真的不明白通过 JSON 序列化只是为了从第三方映射器中受益的意义。为什么不也使用 jOOQ?

final var account = 
    dc.selectFrom(ACCOUNT)
      .limit(1)
      .fetchOneInto(Account.class);

或者,如果 Account 是不可变的 class(例如 Java 记录),为什么不使用这样的类型安全映射:

final var account = 
    dc.selectFrom(ACCOUNT)
      .limit(1)
      .fetchOne(Records.mapping(Account::new));