为什么 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() 来刷新所有以前的链接
您好,我正在使用 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() 来刷新所有以前的链接