使用Spring Data Rest公开收集超媒体链接,即使它是空的

时间:2015-04-16 07:42:38

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

首先,我读了上一个问题: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;
    }
}

但通过这样做,链接将暴露给所有集合。

我可以为我想要的东西创造条件,但我认为不干净。

1 个答案:

答案 0 :(得分:2)

我认为Spring在尝试发现集合的类型时会有一些魔力 - 在空集合上你无法分辨它是什么类型 - 所以spring-data-rest无法确定使用哪个ResourceProcessor。

我想我已经看过了 org.springframework.data.rest.webmvc.ResourceProcessorHandlerMethodReturnValueHandler.ResourcesProcessorWrapper#isValueTypeMatch他们试图通过查看集合中的第一个元素来确定类型,否则只是停止处理:

if (content.isEmpty()) {
    return false;
} 

所以我认为你无法使用spring-data-rest来解决这个问题。对于您的控制器,您可以回退编写自定义控制器并使用spring hateoas并实现您自己的ResourceAssemblerSupport以查看空集合上的链接。