Federdatenruhe Mehrdeutige Assoziationsausnahme

8

Das neu hinzugefügte LinkCollectingAssociationHandler wirft aufgrund einer mehrdeutigen Verknüpfung in meiner Domänenklasse eine MappingException .

Das Links-Array sieht folgendermaßen aus:

[<http://localhost:8080/rooms/2/roomGroups>;rel="roomGroups", <http://localhost:8080/rooms/2/userGroup>;rel="userGroup", <http://localhost:8080/rooms/2/room>;rel="room", <http://localhost:8080/rooms/2/originatingConferences>;rel="originatingConferences", <http://localhost:8080/rooms/2/user>;rel="user"]

Und es versucht, eine weitere "Raum" -Relation hinzuzufügen, wenn es die Ausnahme auslöst.

Das Problem ist, dass es scheint, Links zu Relationen hinzuzufügen, die ich explizit mit @RestResource(exported = false)

markiert habe

Hier ist ein Beispiel für eine Beziehung, von der ich glaube, dass sie dieses Problem verursacht:

%Vor%

Der Typ RoomsByUserAccessView hat eine eingebettete ID, die aus einem Room und einem User besteht.

Ich habe die eingebettete ID-Eigenschaft auch mit:

versehen %Vor%

und seine Eigenschaften wie folgt:

%Vor%

Wie kann ich erreichen, dass diese Relationen beim Serialisieren zu JSON richtig ignoriert werden?

Mein Code funktionierte vor DATAREST-262 ( Ссылка )

Die vollständige Fehlermeldung, die zurückgegeben wird, wenn ich versuche, die Räume / den Endpunkt zu besuchen, lautet wie folgt:

{ timestamp: "2014-03-17T13:38:05.481-0500" error: "Internal Server Error" status: 500 exception: "org.springframework.http.converter.HttpMessageNotWritableException" message: "Could not write JSON: Detected multiple association links with same relation type! Disambiguate association @com.fasterxml.jackson.annotation.JsonIgnore(value=true) @javax.persistence.ManyToOne(fetch=EAGER, cascade=[], optional=true, targetEntity=void) @org.springframework.data.rest.core.annotation.RestResource(description=@org.springframework.data.rest.core.annotation.Description(value=), path=, exported=false, rel=) private com.renovo.schedulerapi.domain.Room com.renovo.schedulerapi.domain.RoomsByUserAccessViewId.room using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources["content"]->java.util.UnmodifiableCollection[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Detected multiple association links with same relation type! Disambiguate association @com.fasterxml.jackson.annotation.JsonIgnore(value=true) @javax.persistence.ManyToOne(fetch=EAGER, cascade=[], optional=true, targetEntity=void) @org.springframework.data.rest.core.annotation.RestResource(description=@org.springframework.data.rest.core.annotation.Description(value=), path=, exported=false, rel=) private com.renovo.schedulerapi.domain.Room com.renovo.schedulerapi.domain.RoomsByUserAccessViewId.room using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources["content"]->java.util.UnmodifiableCollection[0])" }

    
Ethan Anderson 17.03.2014, 18:49
quelle

2 Antworten

5

Ich hatte ein sehr ähnliches Problem. Beim Hinzufügen einer bidirektionalen Beziehung zwischen zwei Entitäten

Ich habe eine Ausnahme erhalten "" Konnte JSON nicht schreiben: Mehrere Assoziationsverbindungen mit demselben gefunden

relation type! ", während ich einige Lösungen ausprobiere, die ich hier gefunden habe

( @JsonIgnore, @JsonIdentity, @RestResource , ich habe auch versucht zu tun, was Oliver angeboten )

(Die Beziehung wurde ordnungsgemäß mit @JsonManagedReference und @JsonBackReference definiert)

Nichts half.

Am Ende habe ich verstanden, dass der Frühling Datenrest versucht zu

Finde heraus, ob die verknüpfte Entität verknüpfbar ist (während du versuchst, den json des

zu erstellen)

angefragte Entität)

( LinkCollectingAssociationHandler : doWithAssociation -> isLinkableAssociation )

, Dafür sucht er nach einem Repository, das sich mit dem

beschäftigt

verbundene Einheit. Nach dem Hinzufügen eines Repositorys für die verwandte Entität .. funktioniert wie ein Charme ..

(Ich nehme an, dass nach dem Hinzufügen eines Repos eine Zuordnung RepositoryAwareResourceInformation ist

wurde für diese Entity erstellt (das habe ich beim Debuggen gesehen).

    
Hezi Schrager 20.10.2014 14:56
quelle
0

Ich hatte dieses Problem und löste es, wie Ron es vorschlägt, aber ich dachte, ich würde es ein wenig erläutern. Ich habe die ersten paar Male, als ich Rons Antwort gelesen habe, nicht ganz verstanden ...

%Vor%

Ich hatte Repositories für Player und Trade, aber keine für PlayerTrade:

%Vor%

Sobald ich das letzte Repo hinzugefügt habe, hat es funktioniert.

%Vor%

Ich habe versucht, @RestResource mit rel oder exclude zu verwenden, konnte sie aber nicht einwählen. Bedeutet dies, dass jede Entität in unserem JSON-Graphen ein Repository haben muss?

    
javatestcase 06.01.2015 06:36
quelle