如何将投影应用于Spring Data REST查询方法资源?

时间:2015-02-06 09:42:10

标签: java spring rest projection spring-data-rest

我正在使用Spring Data REST 2.1.4.RELEASE。

我创建了

  • 实体Booking
  • 其名为CrudRepository
  • 的REST存储库(扩展BookingRepository
  • 以及投影 BookingDetails(注明@Projection(name="details", types = Booking.class)),用于返回部分已展开的链接实体,例如ResourceActivityApplicant等。

客户端获取.../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*方法进行投影?

1 个答案:

答案 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

如果你无法以这种方式工作,那么让一个正在运行的示例项目看起来会很酷。