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
) genanntBookingRepository
- und einen Projektions
BookingDetails
(mit@Projection(name="details", types = Booking.class)
annotiert) für explodierte einige ihrer verknüpften Einheiten zurückkehr wieResource
,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?
Eine URL wie '.../rest/bookings/search/findByApplicant? Bewerber = 5' ist nicht sehr RESTful. Was ist mit '.../Rest/Buchungen? Bewerber = 5'? –
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 :). –
Die URL riecht nach RPC. Natürlich ist Hypermedia eine gute Sache. –