如何防止 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
如果序列化源(例如 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