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

时间:2015-07-21 11:40:13

标签: java spring rest spring-mvc spring-data-rest

您好我正在使用Spring数据休息而且我在使用PagingAndSortingRepository时遇到了一个奇怪的问题我得到的响应有一个_self链接,但是它也提供了相同实体的重复链接hf:foo as evindent in the below响应。

重复链接"自" :{" 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
  }
}

请帮助。这是居里名称空间的问题。

3 个答案:

答案 0 :(得分:8)

您在此处看到的内容并非您所声称的重复链接。一个是self链接,根据定义需要规范(即没有模板参数)。

另一个附加链接公开了资源类型(在这种情况下是foo的项目资源。这允许客户端在关注链接时推断他们期望的内容(代表什么样的HTTP动词) 。

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

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

现在您可以争辩说,如果附加链接与self链接完全相同,则不需要存在。这将要求客户端更加复杂,因为它基本上需要用&#34来保护访问;如果有,那么使用,如果没有,则做一些不同的事情"。这就是为什么我们决定总是渲染它,只是为了确保寻找基于资源类型的链接的客户无论如何都能找到它们。

答案 1 :(得分:1)

如果你想删除那个"重复的"链接你可以添加这个Bean:

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

答案 2 :(得分:1)

在代码乞求中使用.removeLinks()刷新所有先前的链接