Dariusz Kuc
03/18/2021, 4:14 PMsealed class MyServerRequest
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
data class SingleRequest(val request: String) : MyServerRequest()
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
class BatchRequest @JsonCreator constructor(@get:JsonValue val requests: List<SingleRequest>) : MyServerRequest()
Between those two there is no extra type
field that I could use to detect correct type using @JsonTypeInfo/@JsonSubTypes
. Instead, I parse the incoming requests to a JsonNode
and check whether it is an array to determine appropriate target, i.e.
val jsonNode = rawRequest.bodyToMono(JsonNode::class.java).awaitFirst()
if (jsonNode.isArray) {
objectMapper.treeToValue(jsonNode, BatchRequest::class.java)
} else {
objectMapper.treeToValue(jsonNode, SingleRequest::class.java)
}
the above works fine but I'd like to simplify it and use custom deserializer to handle it, i.e.
@JsonDeserialize(using = MyRequestDeserializer::class)
sealed class MyServerRequest
class MyRequestDeserializer : JsonDeserializer<MyServerRequest>() {
override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): MyServerRequest {
val codec = parser.codec
val jsonNode = codec.readTree<JsonNode>(parser)
return if (jsonNode.isArray) {
codec.treeToValue(jsonNode, SingleRequest::class.java)
} else {
codec.treeToValue(jsonNode, BatchRequest::class.java)
}
}
}
this though fails with stackoverflow error as sealed class implementations look up the root deserializer... any ideas how to make it work?Dariusz Kuc
03/18/2021, 4:45 PM@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
@JsonSubTypes(value = [JsonSubTypes.Type(SingleRequest::class), JsonSubTypes.Type(BatchRequest::class)])
sealed class MyServerRequest
dinomite
03/18/2021, 4:47 PMdinomite
03/18/2021, 4:50 PMDariusz Kuc
03/18/2021, 6:08 PMUnexpected token (`JsonToken.START_OBJECT`), expected `JsonToken.VALUE_STRING`: need JSON String that contains type id
Dariusz Kuc
03/18/2021, 6:09 PM@JsonCreator
annotationDariusz Kuc
03/18/2021, 6:14 PMDariusz Kuc
03/19/2021, 2:15 AM@JsonTypeInfo/@JsonSubTypes
messes up with custom serialization/deserialization using @JsonCreator/@JsonValue
as it attempts to add type information during serialization and read type during deserializationDariusz Kuc
03/19/2021, 2:15 AMDariusz Kuc
03/19/2021, 2:16 AM@JsonDeserialize(using = JsonDeserializer.None::class)
on both implementing classes