Java 为什么Spring数据REST包含;“重复”;链接?
您好,我使用的是SpringDataREST,当我使用PagingAndSortingRepository时,我遇到了一个奇怪的问题。我得到的响应像预期的那样有一个_selflink,但在下面的响应中,它还提供了一个与evindent相同的实体hf:foo的重复链接 重复链接 “self”:{“href”: }和“hf:foo”:{ “href”:“Java 为什么Spring数据REST包含;“重复”;链接?,java,spring,rest,spring-mvc,spring-data-rest,Java,Spring,Rest,Spring Mvc,Spring Data Rest,您好,我使用的是SpringDataREST,当我使用PagingAndSortingRepository时,我遇到了一个奇怪的问题。我得到的响应像预期的那样有一个_selflink,但在下面的响应中,它还提供了一个与evindent相同的实体hf:foo的重复链接 重复链接 “self”:{“href”: }和“hf:foo”:{ “href”:“ 请提供帮助。这是居里名称空间的问题。您在这里看到的不是您声称的重复链接。一个是self链接,需要根据定义进行规范化(即没有模板参数) 另一个附加链
请提供帮助。这是居里名称空间的问题。您在这里看到的不是您声称的重复链接。一个是
self
链接,需要根据定义进行规范化(即没有模板参数)
另一个附加链接公开了资源类型(在本例中为foo
的项资源)。这允许客户端在跟踪链接时推断他们期望的内容(什么表示,使用哪些HTTP谓词)
此外,该特定链接将公开可能应用于该资源的模板变量。例如,如果投影可用于Foo
实例,则嵌入文档的链接将如下所示
{
_links : {
self : { href : "…/foos/8445"},
ht:foo : { href : "…/foos/8445{?projection}" }
}
}
现在你可能会争辩说,如果附加链接与
self
链接相同,那么它就不需要存在。这将要求客户端更加复杂,因为它基本上需要用“如果存在,那么使用,如果没有,那么做些不同的事情”来保护访问。这就是为什么我们决定始终呈现它,只是为了确保查找基于资源类型的链接的客户端无论如何都能找到它们。如果要删除“重复”链接,可以添加此Bean:
@Bean
public ResourceProcessor<Resource<?>> entityProcessor() {
return new ResourceProcessor<Resource<?>>() {
@Override
public Resource<?> process(Resource<?> resource) {
resource.removeLinks();
return resource;
}
};
}
@Bean
公共资源处理器>(){
@凌驾
公共资源流程(资源){
resource.removeLinks();
返回资源;
}
};
}
使用.removeLinks()在请求你的代码刷新之前的所有链接时,有人能帮忙吗?可能是我,但我在这里没有看到重复的链接?self
和hf:foo
从定义上讲是不一样的。正如first
和prev
不一样。那么到底是什么问题呢?嗨@olivergierke,我的意思是self链接是实体foo的链接因此我们得到了hf的另一个链接:foo,它不是一个关联,而是同一个实体的点()。这在2.4.0.M1中并没有发生,但正如在ansahh中所说的,感谢@olivergierke澄清了意图:)。应该注意的是spring Hateoas更改了类名,“Resource”现在是“EntityModel”,并且“ResourceProcessor”现在是“RepresentationModelProcessor”,这也适用于检索单个对象,但破坏了“findAll”默认端点。
@Bean
public ResourceProcessor<Resource<?>> entityProcessor() {
return new ResourceProcessor<Resource<?>>() {
@Override
public Resource<?> process(Resource<?> resource) {
resource.removeLinks();
return resource;
}
};
}