Zyklische Referenzen in einer bidirektionalen Viele-zu-Viele-Beziehung

8

Ich habe eine bidirektionale Beziehung von vielen zu vielen in meinen Entitäten. Siehe das folgende Beispiel:

%Vor%

Wenn ich versuche, dies zu JSON zu serialisieren, bekomme ich die folgende Ausnahme: '

  

"java.lang.IllegalArgumentException: Kann verwaltete / zurück nicht verarbeiten   Verweis 'COLLABORATION_TAG': Rückverweistyp (java.util.Set) nicht   kompatibel mit verwaltetem Typ (foo.Collaboration).

Eigentlich weiß ich, dass dies sinnvoll ist, weil das javadoc explizit angibt, dass Sie @JsonBackReference nicht für Collections verwenden können. Meine Frage ist, wie soll ich dieses Problem angehen? Was ich für jetzt getan habe, ist das Entfernen der @ JsonManagedReference Annotation auf der übergeordneten Seite und das Hinzufügen des @ JsonIgnore auf der untergeordneten Seite. Könnte mir jemand sagen, was die Nebenwirkungen dieses Ansatzes sind? Gibt es noch andere Vorschläge?

    
tstorms 29.11.2012, 16:21
quelle

2 Antworten

3
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ qstnhdr ___ Zyklische Referenzen in einer bidirektionalen Viele-zu-Viele-Beziehung ___ answer28910088 ___

sehr praktische Schnittstelle Implementierung wird in Jackson 2 Bibliothek als

zur Verfügung gestellt %Vor%

in maven

%Vor%     
___ tag123manytomany ___ Eine Art von Beziehung zwischen Entitäten der Typen A und B, die einer Entität vom Typ A und umgekehrt eine Liste von Entitäten vom Typ B zuordnet. Die Typen A und B können vom gleichen Typ sein. ___ tag123jackson ___ Jackson ist eine Java-Bibliothek für Aufgaben wie Lesen und Schreiben (Parsen / Generieren) und Datenbindung an / von Java-Objekten. Obwohl Jackson hauptsächlich für JSON verwendet wird, unterstützt Jackson auch viele andere Datenformate wie Avro, CBOR, CSV, Java-Eigenschaften, Protobuf, Smile, XML und YAML. ___ tag123json ___ JSON (JavaScript Object Notation) ist ein Textdatenaustauschformat und sprachunabhängig. Verwenden Sie dieses Tag, wenn dieses Textformat beteiligt ist. VERWENDEN SIE DIESEN TAG NICHT FÜR NATIVE JAVASCRIPT-OBJEKTE ODER JAVASCRIPT OBJECT LITERALS. Bevor Sie eine Frage stellen, wenn Sie glauben, dass Ihr JSON gültig ist, überprüfen Sie diese bitte in einem JSON-Validator wie JSONLint, damit Ihre Frage beantwortet wird, bevor Sie sie überhaupt stellen. ___ qstntxt ___

Ich habe eine bidirektionale Beziehung von vielen zu vielen in meinen Entitäten. Siehe das folgende Beispiel:

%Vor%

Wenn ich versuche, dies zu JSON zu serialisieren, bekomme ich die folgende Ausnahme: '

  

"java.lang.IllegalArgumentException: Kann verwaltete / zurück nicht verarbeiten   Verweis 'COLLABORATION_TAG': Rückverweistyp (java.util.Set) nicht   kompatibel mit verwaltetem Typ (foo.Collaboration).

Eigentlich weiß ich, dass dies sinnvoll ist, weil das javadoc explizit angibt, dass Sie @JsonBackReference nicht für Collections verwenden können. Meine Frage ist, wie soll ich dieses Problem angehen? Was ich für jetzt getan habe, ist das Entfernen der @ JsonManagedReference Annotation auf der übergeordneten Seite und das Hinzufügen des @ JsonIgnore auf der untergeordneten Seite. Könnte mir jemand sagen, was die Nebenwirkungen dieses Ansatzes sind? Gibt es noch andere Vorschläge?

    
___ answer 14878691 ___

Ich habe die folgende Lösung implementiert.

Ein Ende der Beziehung wird als das übergeordnete Element betrachtet. Es benötigt keine Jackson Annotation.

%Vor%

Die andere Seite der Beziehung wird wie folgt implementiert.

%Vor%

Ich verwende einen benutzerdefinierten Serializer, um sicherzustellen, dass keine zyklischen Referenzen auftreten. Der Serializer könnte so implementiert werden:

%Vor%

Dieser Serializer zeigt nur eine begrenzte Anzahl von Eigenschaften der Collaboration-Entität an. Da die Eigenschaft "Tags" weggelassen wird, treten keine zyklischen Referenzen auf.

Eine gute Lektüre über dieses Thema finden Sie hier . Es erklärt alle Möglichkeiten, wenn Sie ein ähnliches Szenario haben.

    
___
tstorms 14.02.2013, 15:50
quelle
1

sehr praktische Schnittstelle Implementierung wird in Jackson 2 Bibliothek als

zur Verfügung gestellt %Vor%

in maven

%Vor%     
Oleksii 07.03.2015 00:45
quelle

Tags und Links