Utilizzo Spring Data REST 2.1.4.RELEASE.Come si applica una proiezione a una risorsa del metodo di query REST di Spring Data?
ho creato
- un'entità
Booking
, - suo repository REST (estendendo
CrudRepository
) denominatoBookingRepository
- e una proiezione
BookingDetails
(annotato con@Projection(name="details", types = Booking.class)
) per la restituzione alcuni dei suoi soggetti legati esploso , ad esempioResource
,Activity
,Applicant
ecc.
Il client riceve tutte le prenotazioni con .../rest/bookings
e la risposta JSON include collegamenti per le entità collegate. Se aggiunge ?projection=details
, le entità collegate vengono esplose e restituite. E questo è fantastico.
Ora aggiungo questo metodo personalizzato al repository:
List<Booking> findByApplicant(@Param("applicant") Person applicant);
Quando il client richiama con .../rest/bookings/search/findByApplicant?applicant=5
, sembrano esserci alcun modo per richiedere la proiezione details
. A seguito di tentativi vengono ignorati:
- aggiungendo
&projection=details
alla stringa di query rendere il metodo restituisce sempre
BookingDetails
:List<BookingDetails> findByApplicant(@Param("applicant") Person applicant);
Riassumendo, metodi di ricerca personalizzati (findBy*
) non restituiscono un proiezione. A meno che non annoti il repository con @RepositoryRestResource(excerptProjection = BookingDetails.class)
, ma questo porta ad alcuni problemi, prima di tutto il client deve sempre utilizzare la stessa proiezione. Come possiamo consentire all'utente di utilizzare le proiezioni anche con i metodi findBy*
?
Un URL come '.../rest/bookings/search/findByApplicant? Candidate = 5' non è molto RESTful. Che dire di '.../rest/prenotazioni? Candidato = 5'? –
Anche se non ha nulla a che vedere con la domanda dei poster originali, cosa non ha riguardo a questo URI? Per essere precisi, non si può giudicare la tranquillità di un URI per definizione in quanto dipende unicamente dal fatto che la risorsa esposta attraverso esso segua la semantica HTTP. Se l'id della risorsa è '/ foo' o'/conquer/the/world' è completamente irrilevante. Detto questo, Spring Data REST sfrutta l'ipermedia per consentire ai clienti di navigare verso le risorse in modo che la struttura se gli ID delle risorse diventi anche meno rilevante per nulla :). –
L'URL ha un odore simile a RPC. Ovviamente l'ipermedia è una buona cosa. –