如何防止 Jackson 在反序列化时将 kotlin.Boolean 参数设置为 false

How to prevent Jackson to set kotlin.Boolean parameter to false when deserializing

如果序列化源(例如 json 对象)不包含该字段,我如何指示 Jackson 不自动将 kotlin.Boolean 参数反序列化为 false

查看当前示例:

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper

data class Test(
    var param1: String,
    var param2: Boolean
)

fun main() {
    val mapper = jacksonObjectMapper()
    // passes, param2 is set to false, why isnt exception thrown?
    val test1 = mapper.readValue("{\"param1\": \"bah\"}", Test::class.java)
    // throws com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException
    val test2 = mapper.readValue("{\"param2\": true}", Test::class.java)
}

在第一种情况下,我没有给布尔参数赋值,如何让 jackson 报错?

我对此很感兴趣,因为我希望我的 API 在客户端没有给布尔参数赋值时停止并抱怨。我不希望在发生这种情况时将其简单地设置为 false。

谢谢!

var param2: Boolean? = null 一样将您的字段设置为可空并设置

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

看完本期jackson-module-kotlin终于自己找到了答案:https://github.com/FasterXML/jackson-module-kotlin/issues/130

显然,kotlin 的 Boolean 是原语的别名。

还有一个名为 FAIL_ON_NULL_FOR_PRIMITIVES 的 jackson 反序列化功能。

因此,就我而言,通过调用 objectMapper.enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)

解决了问题

或者对于 spring 引导,属性 spring.jackson.deserialization.FAIL_ON_NULL_FOR_PRIMITIVES=true