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
),则记录在服务器端正确反序列化。
涉及到几个位,所以我什至不确定是哪个导致了问题:
- 可能是因为 JOOQ 如何生成带有
var
的记录
- 也许是 Wildfly / RestEasy 在做一些时髦的事情
- 可能是 Jackson 没有正确反序列化记录(我尝试添加 jackson kotlin 模块,但似乎没有任何区别)
任何指点将不胜感激。
版本: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>
我有一个 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
),则记录在服务器端正确反序列化。
涉及到几个位,所以我什至不确定是哪个导致了问题:
- 可能是因为 JOOQ 如何生成带有
var
的记录
- 也许是 Wildfly / RestEasy 在做一些时髦的事情
- 可能是 Jackson 没有正确反序列化记录(我尝试添加 jackson kotlin 模块,但似乎没有任何区别)
任何指点将不胜感激。
版本: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
属性:
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>