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

前端之家收集整理的这篇文章主要介绍了java – 使用Spring Data Rest公开集合​​上的超媒体链接,即使它是空的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
首先,我读了上一个问题: Exposing link on collection entity in spring data REST

但问题仍然存在,没有诡计.

实际上,如果我想公开集合资源的链接,我正在使用以下代码

  1. @Component
  2. public class FooProcessor implements ResourceProcessor<PagedResources<Resource<Foo>>> {
  3.  
  4. private final FooLinks fooLinks;
  5.  
  6. @Inject
  7. public FooProcessor(FooLinks fooLinks) {
  8. this.FooLinks = fooLinks;
  9. }
  10.  
  11. @Override
  12. public PagedResources<Resource<Foo>> process(PagedResources<Resource<Foo>> resource) {
  13. resource.add(fooLinks.getMyCustomLink());
  14. return resource;
  15. }
  16. }

这是正常的,除非收集是空的…

唯一可行的方法是将以下代码替换为:

  1. @Component
  2. public class FooProcessor implements ResourceProcessor<PagedResources> {
  3.  
  4. private final FooLinks fooLinks;
  5.  
  6. @Inject
  7. public FooProcessor(FooLinks fooLinks) {
  8. this.FooLinks = fooLinks;
  9. }
  10.  
  11. @Override
  12. public PagedResources process(PagedResources resource) {
  13. resource.add(fooLinks.getMyCustomLink());
  14. return resource;
  15. }
  16. }

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

我可以创造条件只暴露我想要的但我认为不干净.

解决方法

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

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

  1. if (content.isEmpty()) {
  2. return false;
  3. }

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

猜你在找的Java相关文章