Java 如何将投影应用于Spring数据REST查询方法资源?
我使用的是SpringDataREST2.1.4.RELEASE 我创造Java 如何将投影应用于Spring数据REST查询方法资源?,java,spring,rest,projection,spring-data-rest,Java,Spring,Rest,Projection,Spring Data Rest,我使用的是SpringDataREST2.1.4.RELEASE 我创造 实体预订 它的REST存储库(扩展crudepository)名为BookingRepository 用于返回其链接实体的投影预订详细信息(用@projection(name=“details”,types=Booking.class)注释)爆炸,如资源,活动,申请人等 客户端通过../rest/bookings获取所有预订,JSON响应包括链接实体的链接。如果它添加了?projection=details,则链接的实
- 实体
预订
- 它的REST存储库(扩展
)名为crudepository
BookingRepository
- 用于返回其链接实体的投影
(用预订详细信息
注释)爆炸,如@projection(name=“details”,types=Booking.class)
,资源
,活动
等申请人
../rest/bookings
获取所有预订,JSON响应包括链接实体的链接。如果它添加了?projection=details
,则链接的实体将被分解并返回。这太棒了
现在,我将此自定义方法添加到存储库中:
List<Booking> findByApplicant(@Param("applicant") Person applicant);
总之,自定义搜索方法(
findBy*
)从不返回投影。除非您使用@RepositoryRestResource(extractprojection=BookingDetails.class)
注释存储库,但这会导致一些问题,首先客户端必须始终使用相同的投影。我们如何允许用户也使用findBy*
方法使用投影?我已经验证了使用Spring数据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'
对于越来越受欢迎的人来说,情况也是如此。使用它所需的语法是:
http :8080/orders/search/findByApplicant applicant==5 projection==details
如果您不能让它以这种方式工作,那么查看一个正在运行的示例项目就很酷了。像
../rest/bookings/search/findByApplicant?applicator=5这样的URL不是很RESTful。关于../rest/bookings?applicator=5
?虽然这与最初的海报问题完全无关,但这个URI有什么不可保留的?确切地说,您不能根据定义来判断URI的RESTfull,因为它仅仅取决于通过URI公开的资源是否遵循HTTP语义。资源的id是/foo
还是/conquer/the/world
完全无关。这就是说,SpringDataREST利用超媒体让客户机导航到资源,因此,如果资源的ID变得不那么重要,那么结构就会变得不相关:)。URL闻起来像RPC。当然,超媒体是件好事。URI没有气味,它们是不透明的东西。重要的是资源及其行为:)。非常感谢!我很愚蠢:几天前我用Spring数据REST 2.1.4测试了这个,但没有成功;然后我更新到2.2.1,没有进行测试(我只测试了新的摘录投影)。既然我测试了。。我知道它是有效的!!我不认为这可以在我需要的时候实现:现在我纠正我的问题。谢谢,很抱歉浪费了你的时间!别担心。我也觉得有点愚蠢,用一个简单的、无引号的cURL
看不到任何参数。另外,当这些问题成为其他遇到相同问题的人的规范参考时,仍然可以得到这些问题:)。很高兴它对你有用!嗨,我遇到了类似的情况。上述解决方案适用于自定义查询方法。但是如何为内置方法添加投影呢。例如,如果我有一个订单实体,/orders将为我提供应用了投影的所有订单。但当我使用self.href链接(例如/orders/58fa7da00498e41f81a9f806)搜索单个订单时,不会应用投影。我怎样才能做到这一点?
http :8080/orders/search/findByApplicant applicant==5 projection==details