【问题标题】:How to prevent Jackson to set kotlin.Boolean parameter to false when deserializing反序列化时如何防止Jackson将kotlin.Boolean参数设置为false
【发布时间】:2019-09-13 11:05:39
【问题描述】:

如果序列化的源(例如 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)
}

在我没有给布尔参数赋值的第一种情况下,如何让杰克逊抱怨异常?

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

谢谢!

【问题讨论】:

    标签: kotlin jackson json-deserialization


    【解决方案1】:

    终于我自己通过阅读本期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 boot,属性spring.jackson.deserialization.FAIL_ON_NULL_FOR_PRIMITIVES=true

    【讨论】:

    • 对于单个字段,您还可以设置@JsonProperty(required = true),以供遇到这种情况并考虑到这种情况的人。
    • 如果您有@JsonTypeInfo 并且使用杰克逊的多态性,则设置@JsonProperty(required = true) 不起作用
    【解决方案2】:

    像var param2: Boolean? = null 一样设置你的字段为空并设置

    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    

    【讨论】:

    • 这可行,但我不希望该属性可以为空。这背后的用例是一个接受订单的api,其中订单类也是一个jpa实体,将布尔属性持久化到数据库中,最后是一个non_null列......我希望在通过创建对象时都设置它json,并通过业务逻辑
    • 哦,好吧!我明白了
    猜你喜欢
    • 2014-10-29
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多