我正在使用Spring Data REST 2.1.4.RELEASE。
我创建了
Booking
,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*
方法进行投影?
答案 0 :(得分:14)
我使用Spring Data REST 2.2.1验证了这一点,所以请更新它。确保您的客户端实际上按预期发送所请求的参数。在调试时,我发现了如果您没有显式引用URI,则cURL会删除查询参数。所以这个:
curl http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details
将不发送任何查询参数。引用URI后,它将会。
curl 'http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details'
对于越来越受欢迎的HTTPie,有相同的排序。有了它,所需的语法是:
http :8080/orders/search/findByApplicant applicant==5 projection==details
如果你无法以这种方式工作,那么让一个正在运行的示例项目看起来会很酷。