2017-12-06 6 views
0

Ich habe viele verwandte Ressourcen mit exportierten Repositories im Backend (Spring Data REST). Mein Client lädt "root" -Ressource mit GET und lädt dann verwandte Ressourcen über "_links" -Eigenschaften. Der Client kann dann einige Ressourcen im geladenen Diagramm ändern.Was ist der beste Weg, um tief verschachtelte JSON-Struktur mit Spring Data REST zu aktualisieren?

Ich möchte Service implementieren, die Json mit allen Lazy-Loaded Ressourcen und Update-Ressourcen mit Versionsprüfung (optimistisch) auf einmal zu nehmen.

Was ist der beste Weg, dies zu implementieren? Ist dieser Ansatz eine schlechte Praxis?

+0

Klingt als ein guter Ort für https://www.graphql.com/ – StanislavL

+0

Klingt wie ein guter Ansatz, aber wäre interessant zu sehen, wie Sie es implementieren. Mit bestimmter fehlender Konfiguration, kann JVM für einen Wurf senden, stellen Sie sicher, dass Sie Singleton Design-Muster für Utility-Sachen implementieren –

+0

Wie wäre es, "tun Sie das nicht"? JSON ist eine Repräsentation einer Datenstruktur, nicht die Datenstruktur selbst. Verwenden Sie eine geeignete Abstraktion und Kapselung. Konvertieren zu und von JSON nur für I/O. – Raedwald

Antwort

0

Sounds als ein guter Ort für graphql.com

Es ermöglicht alle zu bekommen die Daten, die Sie benötigen, in einer Anfrage. Sie können API- und Anrufabfragen definieren, die nur den notwendigen Teil der Daten anfordern.

Es unterstützt auch benutzerdefinierte Updates.

0

Ich habe nicht vollständig verstanden, was Sie meinen, aber wenn Sie geschachtelte Ressourcen "begierig" in SDR laden möchten, können Sie den Export von verwandten 'geschachtelten' Repos deaktivieren (oder sogar komplett entfernen). Zum Beispiel:

@Entity 
public class Parent { 
    //... 
    @OneToMany(cascaded = ALL, orphanRemoval = true) 
    private Set<Child> children; 
} 

@Entity 
public class Child { 
    //... 
} 

@RepositoryRestResource 
public interface ParentRepo extends JpaRepository<Parent, Long> {} 

@RepositoryRestResource(exported = false) 
public interface ChildRepo extends JpaRepository<Child, Long> {} 

Sie können auch cascade = ALL, orphanRemoval = true Parameter OneToMany Anmerkung hinzuzufügen.

Dann werden alle Ihr Kind Objekte werden von Parent-Objekt verwaltet werden, und die gemeinsame Nutzlast sieht wie folgt sein:

{ 
    "name": "parent1", 
    "children": [ 
     { 
     "name": "child1" 
     }, 

     { 
     "name": "child2" 
     } 
    ] 
} 
+0

Vielen Dank für Ihre Antwort! Ich denke, dass ich ein gemischtes Verhalten brauche: Der Client lädt Ressourcen faul, aktualisiert sie aber mit einer Anfrage. Kann ich Ressourcen beim Lesen "exportierte = true" und beim Lesen "exportierte = false" machen? – Aleksandr

+0

Vergiss nicht, Antworten zu akzeptieren, die dir geholfen haben ...;) – Cepr0

+0

Ich akzeptiere deine Antwort in anderer Frage, aber diese Frage ist für mich immer noch unklar. Ich möchte Ressourcen "exportiert" haben (Clients lazy laden sie), aber ich brauche etwas wie "Transaktion", um modifizierte Ressourcen zusammen zu "committen". – Aleksandr

Verwandte Themen