由于区分大小写,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));
以下代码失败:
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));