Spring data rest Hateoas - 如何处理同一实体的不同 uri

Spring data rest Hateoas - How to deal with different uris for the same entity

我通过用户存储库以以下形式公开了项目实体:

http://localhost:8080/api/users/0/items

并通过项目存储库公开为:

http://localhost:8080/api/items

只有后一个接受post,第一个不支持post动作。

如果客户得到

http://localhost:8080/api/users/0/items/1

并尝试更新它取回的项目:

"status": 405,
"error": "Method Not Allowed",

通过以下 url 进行更新工作正常:

http://localhost:8080/api/items/1

有没有办法允许对两个存储库进行更新是否有意义,或者有没有办法告诉客户端 url 它应该用于 post 操作中的什么 restful 方式?

usersitems有自己的存储库。这意味着 item 不依赖于特定的 user - 它可以属于任何一个或多个 users,具体取决于您的限制。这也意味着 user 存储库不控制 items 的生命周期。换句话说,将 item 发布到任何以 /api/users 开头的 URL 超出范围。

/api/users/0/items 是所谓的关联资源。它用于建立 useritem 之间的关系。这是通过将 item 的 URI 发布到此 URL 来完成的。但该项目必须存在。

由此产生的问题是客户应该如何知道?您正确地注意到 HATEOAS 的要点是客户端不必知道 links,或者更糟的是,不必手动创建它们。请注意,不知道 link 和不知道 API 之间存在巨大差异。不知道 /api/items 和不知道有物品仓库是不一样的。还有例如不知道 user 是什么 - 从语义上讲 - 使用 API.

没有意义

有其他选择吗?并不真地。您可以实现一个控制器来处理对 /api/users/0/items 的请求。但这对每个关联资源来说都是大量工作。您可以通过 ResourceProcessor 将项目存储库的 link 添加到每个 user。但这可能会造成混淆,因为你会得到一个 link items 和一个 itemRepositoryaddItems.