首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过在Kotlin中传递默认值来反序列化非空类型

通过在Kotlin中传递默认值来反序列化非空类型
EN

Stack Overflow用户
提问于 2020-07-26 01:30:11
回答 2查看 697关注 0票数 0

我想使用Kotlin中的自定义反序列化程序来反序列化请求模型中的非空字段,如下所示:

代码语言:javascript
复制
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.deser.std.StdDeserializer

data class MyRequest(val foo: Foo) {

    data class Foo(val bar: String)

    companion object {
        object Deserializer : StdDeserializer<Foo>(Foo::class.java) { //This is added to Jackson Module successfully somewhere else
            override fun deserialize(jsonParser: JsonParser?, context: DeserializationContext?): Foo {
                val node: JsonNode = jsonParser!!.codec.readTree(jsonParser)
                return if (node.isNull || node.isTextual.not()) Foo("default")
                else Foo(node.asText())
            }
        }
    }
}

但是当我发送一个空的json主体的post请求时,我得到的是:

代码语言:javascript
复制
[org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Instantiation of [simple type, class com.me.myapi.model.request.MyRequest] value failed for JSON property foo due to missing (therefore NULL) value for creator parameter foo which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException

因为Foo是一个非空类型,并且我没有在foo的请求体中传递任何东西,所以在反序列化之前会抛出这个异常。我想知道是否有一种方法可以处理这个异常,比如给出一个默认值并继续反序列化步骤。

EN

回答 2

Stack Overflow用户

发布于 2020-07-26 15:50:44

使用jackson-databind2.10.0版本,您可以拥有:

代码语言:javascript
复制
data class MyDataClass (
    @JsonSetter(nulls = Nulls.SKIP)
    val defaultParameter:String="some default value",
)

此外,使用jackson-kotlin-module2.8.4或更高版本,您可以执行以下操作:

代码语言:javascript
复制
val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) // "inform" Jackson about Kotlin

...

data class MyDataClass(
    val defaultParameter:String="some default value",
)
票数 1
EN

Stack Overflow用户

发布于 2020-07-26 21:46:40

我通过覆盖反序列化程序的getNullValue()方法简单地实现了这一点:

代码语言:javascript
复制
object Deserializer : StdDeserializer<Foo>(Foo::class.java) {
    override fun deserialize(jsonParser: JsonParser?, context: DeserializationContext?): Foo {
        val node: JsonNode = jsonParser!!.codec.readTree(jsonParser)
        return if (node.isNull || node.isTextual.not()) Foo("default")
        else Foo(node.asText())
    }

    override fun getNullValue(): Foo {
        return Foo("default value")
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63091395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档