如何从Spring Data REST中的集合关联中删除元素?

问题描述 投票:0回答:1

假设您在Spring Data REST中具有一对多或多对多关系。假设您有与用户具有一对多关系的组。如果您从一个组中获得关联列表,您将获得如下链接:

{
  "_embedded": {
    "users": [
      {
        "username": "test25",
        "enabled": false,
        "firstName": "strifng",
        "lastName": "sdfdffff",
        "_links": {
          "self": {
            "href": "…/users/78"
          }
        }
      },
      {
        "username": "test33",
        "enabled": true,
        "firstName": "sd",
        "lastName": "asdfsa",
        "_links": {
          "self": {
            "href": "…/users/77"
          }
          }
        }
      }
    ]
  }

如果您试图从组中删除特定用户,那将毫无用处。您要么被迫将PUT/groups/{id}/users一起使用,但是如果您有成千上万的用户,那是不可能的。您can POST/groups/{id}/users并带有URI列表,但您cant DELETE/groups/{id}/users

为什么?

DELETE的唯一工作方式是调用/groups/{id}/users/{id},但由于无法在集合中返回,因此无法从前端构造此URI。

您如何解决这个问题?

rest spring-boot http spring-data spring-data-rest
1个回答
0
投票

您需要在此处使用的模式是访问关联资源,要求其提供text/uri-list媒体类型,获取所有链接资源的URI,根据需要修改列表,然后将其PUT返回关联资源。即:

GET /groups/4711/users

200 OK
…/users/3149
…/users/41
…/users/4711

后跟一个:

PUT /groups/4711/users 

…/users/3149
…/users/4711

基本上从关联中删除ID为41的用户。

问题

此建议的问题是它当前不起作用🙃。从某种意义上说,由于某些错误,目前无法对URI列表进行查找是有问题的。似乎该功能在某个时候已经失传了(因为它甚至在参考文档中都不再做广告)。好消息是,我已为您提交并修复了a ticket。如果您尝试使用最新快照,则建议的协议应该有效。

一些一般注意事项

通常,很难提供一个API从一般的关联集合中删除单个项目。不幸的是,HTTP DELETE方法仅在目标URI上运行,并且不接受任何请求正文。即您必须为URI中的各个集合元素提供某种识别机制。据我所知,尚无规范定义如何执行此操作,我们也不想参与定义一个规范的工作。

[一个人可以研究使用JSON补丁请求来收集关联资源之类的功能,但这也不是没有问题。我已提交ticket以跟踪该想法。

首先,很难对其他资源的引用列表进行不断地管理。使用自定义资源扩展资源空间可能是一个更好的选择,该资源可以处理用户从组中的取消分配,并通过自定义链接对其进行广告。

© www.soinside.com 2019 - 2024. All rights reserved.