【问题标题】:Make collection propertie render as relation instead of property in json HAL representaion使集合属性呈现为关系而不是 json HAL 表示中的属性
【发布时间】:2019-11-22 03:32:24
【问题描述】:

我得到了 hal 格式的响应:

{
  "name": "Publisher A",
  "bookPublishers": [
    {
      "publishedDate": "2019-07-12T08:19:04.583+0000",
      "_links": {
        "publisher": {
          "href": "http://localhost:8080/api/publishers/1"
        },
        "book": {
          "href": "http://localhost:8080/api/books/2"
        }
      }
    },
    {
      "publishedDate": "2019-07-12T08:19:04.564+0000",
      "_links": {
        "publisher": {
          "href": "http://localhost:8080/api/publishers/1"
        },
        "book": {
          "href": "http://localhost:8080/api/books/1"
        }
      }
    }
  ],
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/publishers/1"
    },
    "publisher": {
      "href": "http://localhost:8080/api/publishers/1"
    },
    "friends": {
      "href": "http://localhost:8080/api/publishers/1/friends"
    },
    "createdBy": {
      "href": "http://localhost:8080/api/publishers/1/contact"
    }
  }
}

我在 bookPublishers 和链接中看到 friends 属性。恕我直言,它们都应该是关联链接(请参阅2.4. Creating the Associations),我可以在哪里“放置”其他资源。

我想让 spring 渲染 bookPublishers 和朋友一样。

示例项目在这里:https://github.com/luvarqpp/poc-springHalRelations

你可以这样做:

git clone https://github.com/luvarqpp/poc-springHalRelations.git
cd poc-springHalRelations
mvn clean spring-boot:run

然后打开http://localhost:8080/api

PS:额外的问题,为业务逻辑提供自己的关系最简单的方法是什么,例如关系“renameAuthor”。

【问题讨论】:

  • bookPublishers 在响应中内联,因为您没有 BookPublisher 的存储库。如果你想要一个链接,然后创建一个存储库。至于创建附加链接,请参阅:stackoverflow.com/questions/23135756/…

标签: spring-data-rest spring-hateoas


【解决方案1】:

对于集合关系,当相关类型的存储库存在时,Spring Data 将提供一个链接。如果不存在存储库,则集合将内联在响应中,否则,客户端将如何获取数据。

因此,为您的 BookPublisher 类型创建一个存储库。

相关documentation部分引用:

负责创建到引用实体的链接的组件(例如对象的 JSON 表示中 _links 属性下的那些对象)。它接受 @Entity 并迭代其属性,为由存储库管理的那些属性创建链接,并在任何嵌入式或简单属性之间进行复制。

您还可以创建一个投影,以便在需要时嵌入数据。客户端可以在请求中指定此投影,从而防止额外的服务器调用。

例如

/publisher/1?projection=withBookPublishers.

https://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts.projections

【讨论】:

  • 如果我制作了完全分离的实体,是否也可以(明确地)在 HAL 响应中包含关联关系? (即没有书籍参考的 Publisher 类,反之亦然;但与 BookPublisher 分开存储库,这增加了它们的关联)
  • 这个解决方案本身不适用于 IdClass 方法,因为 spring-rest 不支持多个键(至少不是开箱即用的)。见jira.spring.io/browse/DATAREST-846stackoverflow.com/a/31830586/11152683
  • 我已将此解决方案实施到我示例的分支中。 github.com/luvarqpp/poc-springHalRelations/tree/solution/… 目前生成的 JSON+HAL 几乎是理想的,但 JPA/Hibernate 映射确实限制了关联表中具有唯一约束(分别用于映射的展位部分)的 manyToMany。这是 JPA 的问题,另一个问题。
猜你喜欢
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2021-07-23
  • 2011-05-08
  • 1970-01-01
  • 2014-04-27
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多