首先,我读了上一个问题:
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来解决这个问题.对于您的控制器,您可以回退编写自定义控制器并使用spring hateoas并实现您自己的ResourceAssemblerSupport以查看空集合上的链接.