【发布时间】:2015-04-06 10:01:03
【问题描述】:
我正在使用 Spring Data REST 2.1.4.RELEASE。
我创造了
- 一个实体
Booking, - 其 REST 存储库(扩展
CrudRepository)名为BookingRepository - 和一个projection
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这样的 URL 不是很 RESTful。.../rest/bookings?applicant=5呢? -
虽然它与原始发帖人的问题完全无关,但这个 URI 有什么令人不安的地方?准确地说,你不能根据定义来判断一个 URI 的宁静性,因为它完全取决于通过它暴露的资源是否遵循 HTTP 语义。资源的 id 是
/foo还是/conquer/the/world完全不相关。也就是说,Spring Data REST 利用超媒体让客户端导航到资源,因此如果资源的 id 甚至变得不那么相关,结构就会变得不那么相关:)。 -
URL 闻起来像 RPC。当然,超媒体是一件好事。
-
URI 没有味道,它们是不透明的东西。重要的是资源及其行为方式:)。
标签: java spring rest projection spring-data-rest