gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:06 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com