Gibt es eine jackson json-Strategie (mit Annotationen oder auf andere Weise), die eine Logik vor und nach der Deserialisierung des Feldes ausführt?

9

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?

  1. 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.

  2. 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.

  1. Die Verwendung einiger benutzerdefinierter Logik in den POJOs-Setter-Methoden ist eine schlechte Übung! Und auf der anderen Seite denke ich, dass Jackson Reflektionen benutzt, um die Felder zu bestimmen ... Keine gute Strategie, auch nicht.

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

  • Sobald ich den POJO durch den jackson mapper deserialisiert habe, gehe ich durch Reflexion in jedes Feld
  • Überprüfen Sie, ob es eingestellt wurde, z. wenn es Null oder -1 für primitive Zahlen ist (zuvor anfängliche Werte). (Eine Konsequenz dieses Ansatzes ist, dass Sie einen Booleschen Wert nicht überprüfen können, wenn er gesetzt wurde)
  • verwende Reflektion für eine andere Art von Prüfung (lasst es Logik X nennen)
  • führt eine Logik aus, die vom Prozentsatz der gesetzten Felder und der logischen X abhängt.

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

    
despot 02.04.2011, 10:32
quelle

1 Antwort

4

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.

    
StaxMan 02.04.2011, 18:14
quelle