首先我阅读了上一个问题:Exposing link on collection entity in spring data REST
但问题依然存在,没有任何技巧。
事实上,如果我想公开一个集合资源的链接,我正在使用以下代码:
@Component
public class FooProcessor implements ResourceProcessor<PagedResources<Resource<Foo>>> {
private final FooLinks fooLinks;
@Inject
public FooProcessor(FooLinks fooLinks) {
this.FooLinks = fooLinks;
}
@Override
public PagedResources<Resource<Foo>> process(PagedResources<Resource<Foo>> resource) {
resource.add(fooLinks.getMyCustomLink());
return resource;
}
}
除非集合为空,否则一切正常...
唯一可行的方法是将我的以下代码替换为:
@Component
public class FooProcessor implements ResourceProcessor<PagedResources> {
private final FooLinks fooLinks;
@Inject
public FooProcessor(FooLinks fooLinks) {
this.FooLinks = fooLinks;
}
@Override
public PagedResources process(PagedResources resource) {
resource.add(fooLinks.getMyCustomLink());
return resource;
}
}
但是通过这样做,链接将为所有集合公开。
我可以为我想要的但我认为不干净的东西创造条件。
最佳答案
我认为 spring 在尝试发现集合的类型方面发挥了一些作用 - 在空集合上你无法分辨它是哪种类型 - 因此 spring-data-rest 无法确定要使用哪个 ResourceProcessor。
我好像看过
org.springframework.data.rest.webmvc.ResourceProcessorHandlerMethodReturnValueHandler.ResourcesProcessorWrapper#isValueTypeMatch
他们尝试通过查看集合中的第一个元素来确定类型,否则就停止处理:
if (content.isEmpty()) {
return false;
}
所以我认为你不能使用 spring-data-rest 解决这个问题。对于您的 Controller ,您可以退回到编写自定义 Controller 并使用 spring hateoas 并实现您自己的 ResourceAssemblerSupport 以查看空集合上的链接。
关于java - 使用 Spring Data Rest 在集合上公开超媒体链接,即使它是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29668365/