java - 使用 Spring Data Rest 在集合上公开超媒体链接,即使它是空的

标签 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;
    }
}

但是通过这样做,链接将为所有集合公开。

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

最佳答案

我认为 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/

相关文章:

Spring Data Rest 可分页子集合

postgresql - 如何向 jpa/hibernate 查询提供 LocalDateTime?

java - 如何在自定义 Spring Data Rest Controller 中正确处理 POST?

java - 为什么 gradle 不能在 IntelliJ IDEA 的终端窗口中运行?

Sencha Touch 的 Java 包装器

java - 接口(interface)和抽象类广告方法覆盖

java - 静态资源(图片)Tomcat或Nginx服务器

spring - 如何使用 Spring 初始化 Jersey 应用程序(ResourceConfig)?

java - java中的字符串修改

java - 最新版本的 spring boot 问题