Ich muss Code ausführen, nachdem die Deserialisierung in den Feldern eines POJO durchgeführt wurde. Gibt es irgendeine Möglichkeit, dies durch eine Jackson Annotation (oder andere) Strategie zu tun?
Ein Weg, um damit zu gehen, ist ein benutzerdefinierter Deserializer für jeden Feldtyp, der PostLogicDeserializerInterface implementiert oder einige PostLogicDeserializerAbstract erweitert. Aber das wird viel Cluttering-Code erzeugen, der schwer zu pflegen ist (anstatt nur @JsonProperty zu verwenden). Also ich denke das ist keine gute Idee.
Ich habe gesehen, dass Sie @JsonDeserialize auf Klassenebene, aber nur für Wertklassen verwenden können. Aus der Dokumentation:
Beim Annotieren von Wertklassen wird die Konfiguration für Instanzen der Wertklasse verwendet, sie kann jedoch durch spezifischere Annotationen überschrieben werden (solche, die Methoden oder Feldern zugeordnet sind).
Also ich denke, das wird auch nicht funktionieren.
Mein Ziel besteht darin, den Prozentsatz der Felder festzulegen, die vom Deserializer festgelegt wurden. Ich müsste einen Zähler haben, der bei jeder aufgerufenen Deserialisierung (ausgefülltes Feld) erhöht wird. Und sobald die Deserialisierung der ganzen Klasse (POJO) vorbei ist, müsste ich eine Logik durch Reflexion ausführen.
Die Art, wie ich jetzt implementiert habe, ist
Ich würde etwas Jackson-Strategie bevorzugen, da ich das POJO nicht mit Reflexion überprüfen müsste. Es wird lieber an Ort und Stelle gemacht (zum Zeitpunkt der Deserialisierung des POJO).
Prost,
Despot
Es gibt zu diesem Zeitpunkt keine spezielle Funktion für die Post- oder Vorverarbeitung. und diese Art von nähert sich den Grenzen dessen, was Datenbindung tun sollte. Wenn ich dies für bestimmte Felder tun müsste, würde ich es wahrscheinlich nur in Setter hinzufügen, da das einfach ist und funktioniert; aber erfordert dieselbe Logik in allen relevanten Setter.
@JsonDeserialize kann auch für einzelne Eigenschaften (Feld, Setter) verwendet werden, so dass Sie einen benutzerdefinierten Deserializer erstellen können: und da Sie nachbearbeiten möchten, können Sie einfach "echten" Deserializer finden (idealerweise indem Sie JsonDeserializer
implementieren) entweder ContextualDeserializer
oder ResolvableDeserializer
- dies spielt hier keine Rolle, aber im allgemeinen Fall ist es hier getan, um Probleme mit zyklischen Abhängigkeiten zu vermeiden, delegieren Sie daran und ändern Sie den Wert. Dies setzt voraus, dass es sich um einen Wert handelt, der für Sie mehr als nur ein Feld ist.
Schließlich gibt es auch Möglichkeiten, BeanDeserializer
Instanzen zu ändern (durch Registrierung von BeanDeserializerModifier
) - Sie könnten relevante Komponenten (SetTableBeanProperty, denke ich ...) unterteilen, um zusätzliche Behandlung zu haken, oder sogar Deserializer zu ersetzen Verwenden Sie einen Verweis auf den ursprünglichen "Standard" Deserializer.
Aber am Ende klingt Ihr Fall wie etwas, das am besten von etwas anderem gehandhabt werden kann: zum Beispiel scheint die Bean-Validierungs-API (jsr-303) eine potentiell gute Übereinstimmung für die Nachverarbeitungslogik zu sein. Da es etwas orthogonal zur Datenbindung ist, könnte es eine bessere Alternative sein, da es unabhängig von der Datenbindung (jackson), wiederverwendbar, all die guten Sachen ist.
Tags und Links java deserialization jackson spring-social