Kurz gesagt, eine meiner Entitäten hat eine GeometryCollection , die eine Ausnahme auslöst, wenn Sie "getBoundary" aufrufen (das Warum dieses Buches ist ein anderes, sagen wir jetzt, es funktioniert so).
Gibt es eine Möglichkeit, Jackson zu sagen, dass er diesen speziellen Getter nicht einbeziehen soll? Ich weiß, dass ich @JacksonIgnore verwenden kann, wenn ich den Code besitze / kontrolliere. Dies ist jedoch nicht der Fall. Jackson erreicht diesen Punkt durch kontinuierliche Serialisierung der übergeordneten Objekte. Ich habe eine Filteroption in der Jackson-Dokumentation gesehen. Ist das eine plausible Lösung?
Vielen Dank!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Eine andere Möglichkeit ist, wenn Sie alle unbekannten Eigenschaften ignorieren möchten, den Mapper wie folgt zu konfigurieren:
quelle
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
wiemapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Verwenden der Java-Klasse
Annotation verwenden
quelle
Annotationsbasierter Ansatz ist besser. Manchmal ist jedoch eine manuelle Bedienung erforderlich. Zu diesem Zweck können Sie ohne ObjectWriter- Methode verwenden .
quelle
Mix-In-Annotationen funktionieren hier, wie bereits erwähnt, ziemlich gut. Eine andere Möglichkeit, die über die Eigenschaft @JsonIgnore hinausgeht, ist die Verwendung von @JsonIgnoreType, wenn Sie einen Typ haben, der niemals eingeschlossen werden sollte (dh wenn alle Instanzen von GeometryCollection-Eigenschaften ignoriert werden sollten). Sie können es dann entweder direkt hinzufügen (wenn Sie den Typ steuern) oder Mix-In verwenden, wie:
Dies kann praktischer sein, wenn Sie viele Klassen haben, die alle einen einzigen 'IgnoredType getContext ()' - Accessor haben (was bei vielen Frameworks der Fall ist).
quelle
Ich hatte ein ähnliches Problem, aber es hing mit den bidirektionalen Beziehungen von Hibernate zusammen. Ich wollte eine Seite der Beziehung zeigen und die andere programmgesteuert ignorieren, je nachdem, mit welcher Ansicht ich es zu tun hatte. Wenn du das nicht kannst, bekommst du böse
StackOverflowException
s. Zum Beispiel, wenn ich diese Objekte hätteIch würde das
parent
Feld in B programmgesteuert ignorieren wollen, wenn ich A betrachte, und daschildren
Feld in A ignorieren, wenn ich B betrachte.Ich habe damit angefangen, Mixins zu verwenden, aber das wird sehr schnell schrecklich. Sie haben so viele nutzlose Klassen herumliegen, die nur zum Formatieren von Daten existieren. Am Ende habe ich meinen eigenen Serializer geschrieben, um dies sauberer zu handhaben: https://github.com/monitorjbl/json-view .
Hier können Sie programmgesteuert angeben, welche Felder ignoriert werden sollen:
Außerdem können Sie mithilfe von Platzhalter-Matchern ganz einfach sehr vereinfachte Ansichten angeben:
In meinem ursprünglichen Fall bestand die Notwendigkeit für einfache Ansichten wie diese darin, das Nötigste über das Elternteil / Kind zu zeigen, aber es wurde auch für unsere rollenbasierte Sicherheit nützlich. Weniger privilegierte Ansichten von Objekten, die benötigt werden, um weniger Informationen über das Objekt zurückzugeben.
All dies kommt vom Serializer, aber ich habe Spring MVC in meiner App verwendet. Um diese Fälle richtig zu behandeln, habe ich eine Integration geschrieben, die Sie in vorhandene Spring-Controller-Klassen einfügen können:
Beide sind auf Maven Central verfügbar. Ich hoffe, es hilft jemand anderem da draußen. Dies ist ein besonders hässliches Problem mit Jackson, das für meinen Fall keine gute Lösung hatte.
quelle
Match.match()
?Wenn Sie bestimmte Eigenschaften für eine Klasse IMMER ausschließen möchten, können Sie die folgende
setMixInResolver
Methode verwenden:quelle
Ein weiterer guter Punkt ist hier zu verwenden
@JsonFilter
. Einige Details hier http://wiki.fasterxml.com/JacksonFeatureJsonFilterquelle