Ich habe ein Problem in meinem benutzerdefinierten Deserializer in Jackson. Ich möchte auf den Standard-Serializer zugreifen, um das Objekt zu füllen, in dem ich deserialisiert habe. Nach der Population werde ich einige benutzerdefinierte Dinge tun, aber zuerst möchte ich das Objekt mit dem Standard-Jackson-Verhalten deserialisieren.Wie rufe ich den Standard-Deserializer von einem benutzerdefinierten Deserializer in Jackson
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, die Standard-Deserializer zu initialisieren, damit ich meine POJO vorab füllen kann, bevor ich meine spezielle Logik starten.
Beim Aufrufen von deserialize aus dem benutzerdefinierten Deserializer Es scheint, dass die Methode aus dem aktuellen Kontext aufgerufen wird, egal wie ich die Serializer-Klasse erstellen. Wegen der Anmerkung in meinem POJO. Dies verursacht eine Stapelüberlaufausnahme aus offensichtlichen Gründen. Ich habe versucht, einen Beansserializer zu initialisieren, aber der Prozess ist extrem komplex und ich habe es nicht geschafft, den richtigen Weg zu finden. Ich habe auch versucht, den Annotations-Introspektor ohne Erfolg zu überladen, weil ich dachte, dass er mir helfen könnte, die Annotation im DeserializerContext zu ignorieren. Endlich scheint es, dass ich mit JsonDeserializerBuilder etwas Erfolg gehabt habe, obwohl ich dazu einige magische Dinge benötige, um den Anwendungskontext aus dem Frühjahr zu erhalten. Ich würde mich über jede Sache freuen, die mich zu einer saubereren Lösung führen könnte. Wie kann ich beispielsweise einen Deserialisierungskontext erstellen, ohne die JsonDeserializer-Annotation zu lesen?
Nr Diese Ansätze nicht helfen: Das Problem besteht darin, dass Sie einen vollständig erstellten Standard-Deserializer benötigen. und das erfordert, dass man gebaut wird, und dann bekommt dein Deserializer Zugriff darauf. 'DeserializationContext' sollte nicht erstellt oder geändert werden. es wird von 'ObjectMapper' bereitgestellt. 'AnnotationIntrospector' hilft ebenfalls nicht beim Zugriff. – StaxMan
Wie hast du es am Ende gemacht? – khituras
Gute Frage. Ich bin mir nicht sicher, aber ich bin mir sicher, dass die Antwort unten mir geholfen hat. Ich bin derzeit nicht im Besitz des Codes, den wir geschrieben haben, wenn Sie eine Lösung finden, bitte posten Sie sie hier für andere. –