【问题标题】:Exposing link on collection entity in spring data REST在 Spring Data REST 中公开集合实体上的链接
【发布时间】:2014-06-17 22:10:56
【问题描述】:

使用 spring data REST 我已经公开了一个ProjectRepository,它支持列出项目并对其执行 CRUD 操作。当我转到http://localhost:8080/projects/ 时,我得到了我所期望的项目列表。

我想要做的是向项目集合的 JSON 响应的 _links 部分添加自定义操作。

例如,我希望对 http://localhost:8080/projects/ 的调用返回如下内容:

{
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/projects/{?page,size,sort}",
      "templated" : true
    },
    "search" : {
      "href" : "http://localhost:8080/projects/search"
    },
    "customAction" : {
       "href" : "http://localhost:8080/projects/customAction"
    }
  },
  "page" : {
    "size" : 20,
    "totalElements" : 0,
    "totalPages" : 0,
    "number" : 0
  }
}

customAction 在某些控制器中定义。

我尝试创建以下类:

public class ProjectCollectionResourceProcessor implements ResourceProcessor<Resource<Collection<Project>>> {

    @Override
    public Resource<Collection<Project>> process(Resource<Collection<Project>> listResource) {
        // code to add the links to customAction here
        return listResource;
    }

}

并将以下 Bean 添加到我的应用程序配置中:

@Bean
public ProjectCollectionResourceProcessor projectCollectionResourceProcessor() {
    return new ProjectCollectionResourceProcessor();
}

process(...) 似乎从未被调用过。添加资源集合链接的正确方法是什么?

【问题讨论】:

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


【解决方案1】:

集合资源呈现Resources&lt;Resource&lt;Project&gt;&gt; 的实例,而不是Resource&lt;Collection&lt;Project&gt;&gt;。因此,如果您相应地更改 ResourceProcessor 实现中的通用类型,它应该可以按您的预期工作。

【讨论】:

  • 添加下面的代码没有帮助public class ProjectsResourceProcessor implements ResourceProcessor&lt;Resources&lt;Project&gt;&gt; { @Autowired private EntityLinks entityLinks; @Override public Resources&lt;Project&gt; process(Resources&lt;Project&gt; resources) { resources.add(entityLinks.linkFor(Project.class).slash("custom") .withRel("custom")); return resources; } }使用 SDR-2.1.0.RELEASE
  • 为了让它工作,我必须实现 ResourceProcessor&lt;PagedResources&gt; 并在代码中确定它是否是 Project 资源。感谢您的帮助。
  • @thorben.jakobsen 我正在寻找一些资源(学习资源:-) 来实施您的解决方案。我也有分页资源。
  • @thorben.jakobsen 我想知道如果您的搜索终点链接提供分页功能会是什么样子。
  • @thorben.jakobsen 您实际上是如何进行类型检查的?你有一个通用的方式与他人分享吗?
【解决方案2】:

我有同样的问题。对我有用的是:

public class ProjectsResourceProcessor implements ResourceProcessor<PagedResources<Resource<Project>>> {

    private final @NonNull EntityLinks entityLinks;

    @Override
    public PagedResources<Resource<Project>> process(PagedResources<Resource<Project>> pagedResources) {

       ...

        return pagedResources;
    }
}

【讨论】:

  • 不存在项目时,不出现链接:'(
  • ResourcesProcessorWrapper::isValueTypeMatch 中有一个明确的检查来检查空内容,它会阻止资源处理器触发。
  • yup 面临同样的问题.. 任何破解这个问题的方法
猜你喜欢
  • 2015-06-22
  • 2016-12-07
  • 1970-01-01
  • 2015-03-14
  • 2018-05-25
  • 2015-11-29
  • 2018-05-05
  • 2023-04-09
  • 2014-05-17
相关资源
最近更新 更多