为什么 Spring Data REST 包含 "duplicate" 链接?

Why does Spring Data REST include "duplicate" links?

您好,我正在使用 spring 数据休息,当我使用 PagingAndSortingRepository 时遇到一个奇怪的问题,我得到的响应有一个 _self link 正如预期的那样,但它也给出了重复的 link 与以下回复中明显的实体 hf:foo 相同。

重复links "self":{"href":“http://localhost:8080/foos/8445” } 和 "hf:foo" :{ "href":“http://localhost:8080/foos/8445

  curl http://localhost:8080/foos?page=0&size=1

        {
      "_links" : {
    "first" : {
      "href" : "http://localhost:8080/foos?page=0&size=1"
    },
    "prev" : {
      "href" : "http://localhost:8080/foos?page=0&size=1"
    },
    "self" : {
      "href" : "http://localhost:8080/foos"
    },
    "next" : {
      "href" : "http://localhost:8080/foos?page=2&size=1"
    },
    "last" : {
      "href" : "http://localhost:8080/foos?page=81&size=1"
    }
  },
  "_embedded" : {
    "hf:foos" : [ {
      "name" : "comsi",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/foos/8445"
        },
        "hf:foo" : {
          "href" : "http://localhost:8080/foos/8445"
        } ]
      }
    } ]
  },
  "page" : {
    "size" : 1,
    "totalElements" : 82,
    "totalPages" : 82,
    "number" : 1
  }
}

请帮忙。是否是 curie 命名空间的问题。

您在此处看到的内容与您所声称的不同 link。一个是 self link ,根据定义需要规范(即没有模板参数)。

另一个额外的 link 公开资源类型(在本例中是 foo 的项目资源)。这允许客户推理他们的期望(什么表示,哪些 HTTP 动词到在 link.

之后使用)

此外,那个特定的 link 将公开可能适用于该资源的模板变量。例如。如果投影可用于 Foo 个实例,则嵌入文档的 link 将如下所示。

 { 
   _links : {
      self : { href : "…/foos/8445"},
      ht:foo : { href : "…/foos/8445{?projection}" }
   }
 }

现在您可能会争辩说,如果附加 link 与 self link 相同,则不需要存在。这将要求客户端更加复杂,因为它基本上需要使用 "if there, then use, if not, do something different" 来保护访问。这就是我们决定始终呈现它的原因,只是为了确保寻找基于 link 资源类型的客户端无论如何都能找到它们。

如果你想删除那个 "duplicated" link 你可以添加这个 Bean:

@Bean
public ResourceProcessor<Resource<?>> entityProcessor() {
  return new ResourceProcessor<Resource<?>>() {
    @Override
    public Resource<?> process(Resource<?> resource) {
      resource.removeLinks();
      return resource;
    }
  };
}

在代码的开头使用 .remove Links() 来刷新所有以前的链接