Wie deserialisiere ich Schnittstellenfelder mit Jacksons objectMapper?

ObjectMapper'sreadValue(InputStream in, Class<T> valueType) Funktion erfordert die Klasse. Aber wie verwende ich es, wenn die Klasse, die ich intern übergebe, ein Interface als Datenelement hat.

Ich kann zwar den Grund für diese Ausnahme verstehen, da Jackson nicht die konkrete Klasse der internen Schnittstelle der übergebenen Klasse abruft, aber meine Frage ist, wie man sie löst. Wie deserialisiere ich es dann? Die Klasse, die ich zu deserialisieren versuche, ist:

class BaseMetricImpl<N> implements Metric<N> {
    protected MetricValueDescriptor descriptor;
}

HierMetricValueDescriptor ist eine Schnittstelle, daher erhalte ich folgenden Fehler:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of MetricValueDescriptor, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information
 at [Source: java.io.ByteArrayInputStream@2ede2c9f; line: 1, column: 2] (through reference chain: SingleValueMetricImpl["descriptor"])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:624)
    at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:115)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:375)
    at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:98)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:308)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2793)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1989)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage