使集合属性呈现为关系,而不是json HAL表示中的属性

时间:2019-07-12 11:05:20

标签: spring-data-rest spring-hateoas

我收到了这样的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 render 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”。

1 个答案:

答案 0 :(得分:1)

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

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

您还可以创建一个投影,以便在需要时内联数据。客户端可以在请求中指定此投影,因此可以防止其他服务器调用。

例如

/ publisher / 1?projection = withBookPublishers。

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