【问题标题】:Exposing hypermedia links on collection even it's empty using Spring Data Rest使用 Spring Data Rest 在集合上公开超媒体链接,即使它是空的
【发布时间】:2015-06-22 11:37:49
【问题描述】:

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

但是通过这样做,所有集合都会显示该链接。

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

【问题讨论】:

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


    【解决方案1】:

    我认为 spring 在尝试发现集合的类型时做了一些魔术 - 在一个空集合上,你无法分辨它是哪种类型 - 所以 spring-data-rest 无法确定要使用哪个 ResourceProcessor。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 2016-04-30
      • 2015-09-03
      • 2016-05-05
      • 2018-01-17
      • 2017-03-02
      • 2023-04-09
      相关资源
      最近更新 更多