Spring数据休息Hateoas - 如何处理同一实体的不同uris

时间:2015-02-19 19:16:11

标签: rest repository spring-hateoas

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

  

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

并通过项目存储库公开:

  

http://localhost:8080/api/items

只有后者接受帖子而第一个不支持后期操作。

如果客户获得

  

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

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

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

通过以下网址更新工作正常:

  

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

有没有办法,是否允许对两个存储库进行更新是有意义的,还是有办法告诉客户端它应该以一种宁静的方式用于后续操作的URL?

1 个答案:

答案 0 :(得分:2)

usersitems拥有自己的存储库。这意味着item与特定user无关 - 它可以属于no,any或许多users,具体取决于您的约束。这也意味着user存储库不控制items的生命周期。换句话说,将item发布到以/api/users开头的任何网址都超出了范围。

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

由此产生的问题是客户应该如何知道?您正确地指出,HATEOAS的要点是客户端不必知道链接,或者更糟糕的是,必须手动创建链接。请注意,不知道链接和不知道API之间存在巨大差异。不知道/api/items并且不知道存在项目存储库是不一样的。例如,不知道user是什么 - 在语义上 - 使用API​​是没有意义的。

有替代品吗?并不是的。您可以实现一个处理器处理/api/users/0/items请求的控制器。但这对每个协会资源来说都是很多工作。您可以通过ResourceProcessor将项目存储库的链接添加到每个user。但这可能会令人困惑,因为您会有一个items和一个itemRepositoryaddItems的链接。