Spring Data REST So fügen Sie eingebettete Ressourcen inline hinzu

8

Ich verwende Spring Data REST und Hateoas in Kombination mit dem HAL-Browser. Das funktioniert perfekt, aber jetzt möchte ich einen JSON-Dump einer bestimmten Entität mit (einer Menge von) zugeordneten Objekten erstellen. Ich habe @Projection benutzt, aber dann bin ich wieder stecken geblieben.

FYI: Das normale Verhalten (mit eingebetteten und Links usw.) sollte neben dem neuen Endpunkt (ohne eingebettete und Links) bleiben.

Um mein Problem / meine Frage weiter zu veranschaulichen:

%Vor%

Nun würde ich gerne so etwas sehen:

%Vor%

Während ich das verstehe:

%Vor%

Siehe auch: Ссылка

In meinem Beispiel habe ich zwei Schwierigkeiten eingeführt, die ich habe: Listen (Firmen) und mehrere Ebenen: Person- & gt; Firmen- & gt; -Adresse. Beide müssen arbeiten (wahrscheinlich 5 Ebenen, von denen einige "viele" Beziehungen haben).

    
codesmith 29.06.2016, 09:56
quelle

3 Antworten

10

Die akzeptierte Methode zum Inlining von Entitäten sind Projektionen, wie Sie sie identifiziert haben. Projektionen sind immer inline, also ist eine Option, Projektionen für jede Ihrer Entitäten zu erstellen und sie wie folgt zu kombinieren:

%Vor%

A GET people/1?projection=personProjection wird weiterhin _links Elemente darstellen, aber Sie erhalten die gewünschte Verschachtelung:

%Vor%

Alternativ können Sie, wenn Sie die Entitäten Company und Address nicht als Restressourcen verfügbar machen müssen, ihre Repositorys mit @RepositoryRestResource(exported=false) kennzeichnen, und sie werden unabhängig davon, wo sie referenziert sind, inline eingefügt Projektionen.

Ein letzter Vorbehalt allerdings - diese Anfrage kämpft etwas gegen das Ethos von Spring Data REST und Spring HATEOAS und lädt große, unhandliche Anfragen ein, die unter dem n + 1-Problem leiden. Denken Sie daran, dass Spring Data REST keine schlüsselfertige Lösung ist, um ein Domänenmodell in eine API umzuwandeln, und das Rendern von Deep Object Graphen (falls dies beabsichtigt ist) ist möglicherweise etwas, das Sie als benutzerdefinierten Controller-Endpunkt ad hoc an Sie weitergeben könnten kann die Bedingungen gründlich kontrollieren.

    
Will Faithfull 02.07.2016 22:59
quelle
0

Wenn Sie auf dem zweiten Endpunkt keine Verknüpfungen benötigen, benötigen Sie einen Controller und eine Ressource, wobei Sie die Daten der Ressource zuordnen und die Ressourcensammlung vom Controller zurückgeben.

    
Fahad Fazil 29.06.2016 13:14
quelle
-1

Ich glaube, der beste Weg, um eine Liste oder eine HashMap einzubetten, besteht darin, sie in eine json-Zeichenkette umzuwandeln und zurück in das Java-Objekt, wenn Sie sie lesen ....

Dies kann einfach mit

durchgeführt werden %Vor%

wie in Spring Data mit Mysql JSON-Typ

angezeigt

Wir haben ähnliche Dinge in Spring Data DynamoDb - für AWS DynamoDB

    
Abdeali Chandanwala 07.08.2017 05:08
quelle