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

blu*_*ish 9 java rest spring projection spring-data-rest

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

我建立

  • 一个实体Booking,
  • 它的REST存储库(扩展CrudRepository)命名BookingRepository
  • 和一个投影 BookingDetails(带有加注解的@Projection(name="details", types = Booking.class)用于返回它的一些链接的实体的)分解,例如Resource,Activity,Applicant等.

客户端获取所有预订,.../rest/bookingsJSON响应包括链接实体的链接.如果添加,?projection=details则链接的实体将被展开并返回.这很棒.

现在我将这个自定义方法添加到存储库:

List<Booking> findByApplicant(@Param("applicant") Person applicant);
Run Code Online (Sandbox Code Playgroud)

当客户端调用它时.../rest/bookings/search/findByApplicant?applicant=5,似乎无法请求details投影.以下尝试被忽略:

总而言之,自定义搜索方法(findBy*)永远不会返回投影.除非您使用注释存储库@RepositoryRestResource(excerptProjection = BookingDetails.class),但这会导致一些问题,首先客户端必须始终使用相同的投影.我们如何允许用户也使用findBy*方法投影?

Oli*_*ohm 15

我使用Spring Data REST 2.2.1验证了这一点,所以请更新它.确保您的客户端实际上按预期发送所请求的参数.在调试时,我发现如果你没有明确引用URI,例如cURL会丢弃查询参数.所以这:

curl http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details
Run Code Online (Sandbox Code Playgroud)

不会发送任何查询参数.一旦引用URI,它就会.

curl 'http://localhost:8080/orders/search/findByApplicant?applicant=5&projection=details'
Run Code Online (Sandbox Code Playgroud)

对于越来越受欢迎的HTTPie,有相同的排序.有了它,所需的语法是:

http :8080/orders/search/findByApplicant applicant==5 projection==details
Run Code Online (Sandbox Code Playgroud)

如果您无法以这种方式工作,那么查看正在运行的示例项目会很酷.

  • 非常感谢!我填写愚蠢的:我几天前用Spring Data REST 2.1.4测试过这个并没有用; 然后我更新到2.2.1并没有测试(我只测试了新的`excerptProjection`).现在我测试..我看到它的工作原理!! 我不认为这可以在我需要的时候实施:D现在我更正了我的问题.谢谢,抱歉浪费时间! (2认同)