2015-02-06 3 views
7

Ich verwende Spring Data REST 2.1.4.RELEASE.Wie kann ich eine Projektion auf eine Spring Data REST-Abfragemethodenressource anwenden?

I erstellt

  • eine Entität Booking,
  • seine Ruhe Repository (erstreckende CrudRepository) genannt BookingRepository
  • und einen ProjektionsBookingDetails (mit @Projection(name="details", types = Booking.class) annotiert) für explodierte einige ihrer verknüpften Einheiten zurückkehr wie Resource, Activity, Applicant usw.

Der Kunde erhält alle Buchungen mit .../rest/bookings und die JSON-Antwort enthält Links für die verknüpften Entitäten. Wenn sie ?projection=details hinzufügt, werden die verknüpften Entitäten aufgelöst und zurückgegeben. Und das ist großartig. Jetzt

ich hinzufügen, um dieses benutzerdefinierte Methode zum Repository:

List<Booking> findByApplicant(@Param("applicant") Person applicant); 

Wenn der Client ruft es mit .../rest/bookings/search/findByApplicant?applicant=5 scheint es keinen Weg, um die details Projektion zu beantragen. Folgende Versuche werden ignoriert:

  • Hinzufügen &projection=details an die Query-String-
  • wodurch das Verfahren immer BookingDetails zurück:

    List<BookingDetails> findByApplicant(@Param("applicant") Person applicant); 
    

Summieren, benutzerdefinierte Suchmethoden (findBy*) nie eine Rückkehr Projektion. Es sei denn, Sie notieren das Repository mit @RepositoryRestResource(excerptProjection = BookingDetails.class), aber dies führt zu einigen Problemen, vor allem muss der Client immer die gleiche Projektion verwenden. Wie können wir dem Benutzer erlauben, Projektionen auch mit findBy* Methoden zu verwenden?

+1

Eine URL wie '.../rest/bookings/search/findByApplicant? Bewerber = 5' ist nicht sehr RESTful. Was ist mit '.../Rest/Buchungen? Bewerber = 5'? –

+1

Während es völlig unabhängig von der ursprünglichen Posterfrage ist, was ist an dieser URI unruhig? Um genau zu sein, können Sie die Ruhe eines URI nicht per definitionem beurteilen, da es nur davon abhängt, ob die Ressource, die durch sie offengelegt wird, der HTTP-Semantik folgt. Ob die ID der Ressource "/ foo" oder "/ conquer/the/world" ist, ist völlig irrelevant. Das heißt, Spring Data REST nutzt Hypermedia, um Clients zu den Ressourcen zu navigieren, so dass die Struktur, wenn die IDs der Ressourcen sogar weniger wird, überhaupt nicht relevant :). –

+0

Die URL riecht nach RPC. Natürlich ist Hypermedia eine gute Sache. –

Antwort

13

Ich habe diese Arbeit mit Spring Data REST 2.2.1 überprüft, also bitte aktualisieren Sie es. Stellen Sie sicher, dass Ihr Client tatsächlich die angeforderten Parameter wie gewünscht sendet. Während des Debugging habe ich herausgefunden, dass z.B. cURL verwirft Abfrageparameter, wenn Sie den URI nicht explizit angeben. So folgt aus:

curl http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details 

wird nicht einem der Abfrageparameter senden. Sobald Sie den URI angeben, wird es.

curl 'http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details' 

Sortieren von derselben ist an Ort und Stelle für die immer beliebter werdenden HTTPie. Damit ist die erforderliche Syntax ist:

http :8080/orders/search/findByApplicant applicant==5 projection==details 

Im Fall können Sie nicht bekommen, es so zu arbeiten, es wäre cool, ein laufendes Beispielprojekt zu erhalten, zu betrachten.

+2

vielen Dank! Ich fülle dumm: Ich habe dies vor einigen Tagen mit Spring Data REST 2.1.4 getestet und nicht funktioniert; dann habe ich auf 2.2.1 aktualisiert und nicht getestet (ich habe nur den neuen 'excerptProjection' getestet). Jetzt teste ich .. Ich sehe, dass es funktioniert !! Ich dachte nicht, dass das jetzt implementiert werden könnte, wo ich es brauche: D Jetzt korrigiere ich meine Frage. Danke und Entschuldigung für die Zeitverschwendung! – bluish

+1

Mach dir keine Sorgen. Ich fühlte mich auch irgendwie blöd, da ich überhaupt keine Parameter sah mit einem einfachen, unbenannten 'cURL'. Außerdem ist es immer noch gut, diese Fragen zu bekommen, da sie zu einer kanonischen Referenz für andere werden, die auf dasselbe Problem stoßen :). Schön, dass es für dich funktioniert! –

+0

Hallo, ich bin in eine ähnliche Situation geraten. Die obige Lösung funktioniert für benutzerdefinierte Abfragemethoden. Aber wie fügt man eine Projektion für eingebaute Methoden hinzu. Zum Beispiel, wenn ich eine Order-Entität habe, wird/orders mir alle Bestellungen mit Projektion geben. Wenn ich jedoch mit dem Link self.href nach dem Befehl/orders/58fa7da00498e41f81a9f806 sucht, wird die Projektion nicht angewendet. Wie kann ich das erreichen? – pvpkiran

Verwandte Themen