JOOQ 类 中的布尔字段未被 Jackson/RestEasy 一致地序列化和反序列化

Boolean fields in JOOQ classes not serialized and deserialized consistenly by Jackson/RestEasy

我有一个 Java EE 项目,它使用 JOOQ 使用 Kotin 自动生成记录。

一个这样的记录是:

@Suppress("UNCHECKED_CAST")
open class EmailAddressRecord() : UpdatableRecordImpl<EmailAddressRecord>(EmailAddress.EMAIL_ADDRESS),
    Record5<Int?, Int?, String?, Boolean?, Boolean?> {

//...

  var isInList: Boolean?
    set(value) = set(3, value)
    get() = get(3) as Boolean?

当通过 GET 方法发送到客户端时,记录被序列化为 json,如预期的那样 { "isInList": true }

但是如果我将其发送回 PUT 方法,我会收到有关 isInList 未被识别的错误消息。相反,如果我发送 json 和 inList 属性(没有 is),则记录在服务器端正确反序列化。

涉及到几个位,所以我什至不确定是哪个导致了问题:

任何指点将不胜感激。

版本:jackson 2.12.2、kotlin 1.4.10、widlfly 10、jooq 3.14.10

这是在 jOOQ 3.15.0 和 3.14.12 中实现的修复的扩展:https://github.com/jOOQ/jOOQ/issues/11912

问题是 kotlin 为名为 isInList 的可变属性生成 setInList() setter,而不是 setIsInList()。在上述问题中,这可能与 inList 属性:

的同名 setter 冲突
class X {
  var inList: Boolean?
  var isInList: Boolean?
}

我不相信这在 jOOQ 案例中是有用的优化。我们可以始终在以 IS_:

开头的列的属性上生成 @set:JvmName("...") 注释,而不是仅在出现上述名称冲突时才修复 #11912
class X {
  @set:JvmName("setIsInList")
  var isInList: Boolean?
}

当然,还要使其可配置。从 jOOQ 3.15.0 开始,可以通过指定以下内容来关闭这些注释:

<kotlinSetterJvmNameAnnotationsOnIsPrefix>false</kotlinSetterJvmNameAnnotationsOnIsPrefix>