[英]Deserializing non-null type by passing a default value in Kotlin
我想使用 Kotlin 中的自定义反序列化器反序列化请求 model 中的非空字段,如下所示:
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 正文的发布请求时,我得到了这个:
[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
是非 null 类型,并且我没有在foo
的请求正文中传递任何内容,因此在反序列化之前会抛出此错误。 我想知道是否有办法处理此异常,例如提供默认值并继续反序列化步骤。
使用jackson-databind的2.10.0
版本,您可以拥有:
data class MyDataClass (
@JsonSetter(nulls = Nulls.SKIP)
val defaultParameter:String="some default value",
)
此外,使用jackson-kotlin-module的2.8.4
或更高版本,您可以执行以下操作:
val mapper: ObjectMapper = ObjectMapper().registerModule(KotlinModule()) // "inform" Jackson about Kotlin
...
data class MyDataClass(
val defaultParameter:String="some default value",
)
我只是通过覆盖反序列化器的 getNullValue() 方法来实现这一点:
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")
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.