【问题标题】:How do I apply a projection to a Spring Data REST query method resource?如何将投影应用于 Spring Data REST 查询方法资源?
【发布时间】:2015-04-06 10:01:03
【问题描述】:

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

我创造了

  • 一个实体Booking
  • 其 REST 存储库(扩展 CrudRepository)名为 BookingRepository
  • 和一个projectionBookingDetails(用@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 投影。以下尝试将被忽略:

  • 在查询字符串中添加&amp;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


【解决方案1】:

我验证了它与 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

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

【讨论】:

  • 非常感谢!我很愚蠢:几天前我用 Spring Data REST 2.1.4 对此进行了测试,但没有奏效;然后我更新到 2.2.1 并没有测试(我只测试了新的excerptProjection)。现在我测试了..我看到它有效!我不认为这可以在我需要它的时候实现:D 现在我纠正我的问题。感谢和抱歉浪费时间!
  • 别担心。我也觉得有点愚蠢,用一个简单的、未引用的cURL 根本看不到任何参数。另外,得到这些问题仍然很好,因为它们成为其他遇到相同问题的人的规范参考:)。很高兴它对你有用!
  • 嗨,我遇到了类似的情况。上述解决方案适用于自定义查询方法。但是如何为内置方法添加投影。例如,如果我有一个 Order 实体,/orders 会给我所有应用了投影的订单。但是,当我使用 self.href 链接(例如 /orders/58fa7da00498e41f81a9f806)搜索单个订单时,不会应用投影。我怎样才能做到这一点?
猜你喜欢
  • 2017-09-27
  • 2017-03-10
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2017-07-27
  • 2015-07-25
  • 2017-09-19
  • 2018-04-18
相关资源
最近更新 更多