使用Spring Data REST,如何使用HATEOAS输出格式进行自定义查询?

时间:2015-09-18 03:24:50

标签: spring-data spring-hateoas

我通过转换现有的Spring 3项目来学习Spring 4的东西。在那个项目中,我有一个自定义查询。该查询以直接的方式获取数据,之后对查询结果进行了大量编辑。 现在将数据发送给来电者。

我计划为大多数简单的查询需求扩展CrudRepository。数据将以HATEOAS格式输出。

对于这个自定义查询,我认为我应该添加自定义行为(spring.io,"使用Spring Data Repositories",第1.3.1节,"将自定义行为添加到单个存储库&#34 ;)

举个例子:

@Transactional(readOnly = true)
public List<Offer> getFiltered(List<Org> orgs, OfferSearch criteria) {
    List<Offer> filteredOffers = getDateTypeFiltered(criteria);
    filteredOffers = applyOrgInfo(orgs, filteredOffers);
    filteredOffers = applyFilterMatches(filteredOffers, criteria);
    return sortByFilterMatches(filteredOffers);
}

(该代码仅说明我没有进行简单的值获取。)

如果我可以使用getDateTypeFiltered(criteria)的原始结果,那么我可以将它放入CrudRepository接口,并且输出将由Spring库按摩到HATEOAS中。但我必须在实际的Java对象中进行按摩,而且我不知道如何告诉Spring接受我的输出并以我想要的输出格式发出它。

有没有一种简单的方法从这里到达那里?或者我必须尝试在浏览器中进行过滤吗?

谢谢, 杰罗姆。

1 个答案:

答案 0 :(得分:0)

要正确获取HAL格式的结果,查询控制器必须返回某种形式的Spring HATEOAS资源类型。

@RequestMapping(method = RequestMethod.GET, value = "/documents/search/findAll")
public ResponseEntity<?> findAll() {

    List<Resource<Document>> docs = new ArrayList<>();
    docs.add(new Resource<Document>(new Document("doc1"), new Link("localhost")));
    docs.add(new Resource<Document>(new Document("doc2"), new Link("localhost")));

    Resources<Resource<Document>> resources = new Resources<Resource<Document>>(docs);

    resources.add(linkTo(methodOn(ApplicationController.class).findAll()).withSelfRel());
    resources.add(entityLinks.linkToCollectionResource(Document.class).withRel("documents"));

    return ResponseEntity.ok(resources);
}

我已向Spring Data REST提交拉取请求以更新其参考文档,以在http://docs.spring.io/spring-data/rest/docs/2.4.0.RELEASE/reference/html/#customizing-sdr.overriding-sdr-response-handlers

中指定此内容