Я использую Spring Data REST 2.1.4.RELEASE.
я создал
- объект
Booking
, - его репозиторий REST (расширение
CrudRepository
) с именемBookingRepository
- и проекция
BookingDetails
(с аннотацией@Projection(name="details", types = Booking.class)
) для возврата некоторых связанных объектов в разобранном виде, таких какResource
,Activity
,Applicant
и т. д.
Клиент получает все бронирования с .../rest/bookings
, а ответ JSON включает ссылки на связанные объекты. Если он добавляет ?projection=details
, то связанные объекты разбиваются и возвращаются. И это здорово.
Теперь я добавляю этот пользовательский метод в репозиторий:
List<Booking> findByApplicant(@Param("applicant") Person applicant);
Когда клиент вызывает его с помощью .../rest/bookings/search/findByApplicant?applicant=5
, кажется, нет способа запросить проекцию details
. Следующие попытки игнорируются:
- добавление
&projection=details
в строку запроса чтобы метод всегда возвращал
BookingDetails
:List<BookingDetails> findByApplicant(@Param("applicant") Person applicant);
Подводя итог, можно сказать, что пользовательские методы поиска (findBy*
) никогда не возвращают прогноз. Если вы не аннотируете репозиторий с помощью @RepositoryRestResource(excerptProjection = BookingDetails.class)
, но это приводит к некоторым проблемам, прежде всего, клиент должен всегда использовать одну и ту же проекцию. Как мы можем позволить пользователю использовать проекции также с findBy*
методами?
.../rest/bookings/search/findByApplicant?applicant=5
не очень RESTful. А как насчет.../rest/bookings?applicant=5
? - person   schedule 06.02.2015/foo
или/conquer/the/world
совершенно неважным. Тем не менее, Spring Data REST использует гипермедиа, чтобы позволить клиентам переходить к ресурсам, поэтому структура, если идентификаторы ресурсов даже становятся менее релевантными :). - person Oliver Drotbohm   schedule 06.02.2015