Ich habe ein Problem mit meinem benutzerdefinierten Deserializer in Jackson. Ich möchte auf den Standard-Serializer zugreifen, um das Objekt zu füllen, in das ich deserialisiere. Nach der Population werde ich einige benutzerdefinierte Dinge tun, aber zuerst möchte ich das Objekt mit dem Standardverhalten von Jackson deserialisieren.
Dies ist der Code, den ich im Moment habe.
public class UserEventDeserializer extends StdDeserializer<User> {
private static final long serialVersionUID = 7923585097068641765L;
public UserEventDeserializer() {
super(User.class);
}
@Override
@Transactional
public User deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
User deserializedUser = null;
deserializedUser = super.deserialize(jp, ctxt, new User());
// The previous line generates an exception java.lang.UnsupportedOperationException
// Because there is no implementation of the deserializer.
// I want a way to access the default spring deserializer for my User class.
// How can I do that?
//Special logic
return deserializedUser;
}
}
Was ich brauche, ist eine Möglichkeit, den Standard-Deserializer zu initialisieren, damit ich mein POJO vorab füllen kann, bevor ich meine spezielle Logik starte.
Beim Aufrufen von Deserialize aus dem benutzerdefinierten Deserializer heraus scheint die Methode aus dem aktuellen Kontext aufgerufen zu werden, unabhängig davon, wie ich die Serializer-Klasse konstruiere. Wegen der Anmerkung in meinem POJO. Dies führt aus offensichtlichen Gründen zu einer Stapelüberlaufausnahme.
Ich habe versucht, a zu initialisieren, BeanDeserializer
aber der Prozess ist äußerst komplex und ich habe es nicht geschafft, den richtigen Weg zu finden. Ich habe auch versucht, das AnnotationIntrospector
ohne Erfolg zu überladen , weil ich dachte, es könnte mir helfen, die Anmerkung in der zu ignorieren DeserializerContext
. Schließlich scheint es, als hätte ich einige Erfolge erzielt, JsonDeserializerBuilders
obwohl ich dafür einige magische Dinge tun musste, um den Anwendungskontext von Spring zu erhalten. Ich würde mich über alles freuen, was mich zu einer saubereren Lösung führen könnte, zum Beispiel darüber, wie ich einen Deserialisierungskontext erstellen kann, ohne die JsonDeserializer
Anmerkung zu lesen .
DeserializationContext
ist nichts, was Sie entweder erstellen oder ändern sollten; es wird bereitgestellt vonObjectMapper
.AnnotationIntrospector
Ebenso wird es nicht hilfreich sein, Zugang zu erhalten.