在spring数据REST中公开集合实体上的链接

时间:2014-06-17 22:10:57

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

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

我要做的是将自定义操作添加到Project Collection的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(...)似乎无法被召唤。添加链接到资源集合的正确方法是什么?

2 个答案:

答案 0 :(得分:4)

集合资源呈现Resources<Resource<Project>>的实例,而不是Resource<Collection<Project>>。因此,如果您相应地更改了ResourceProcessor实现中的通用类型,那么它应该按预期工作。

答案 1 :(得分:4)

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

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