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

With Spring Data REST, how to make custom queries use the HATEOAS output format?

我正在通过转换现有的 Spring 3 项目来学习 Spring 4 的内容。在那个项目中,我有一个自定义查询。该查询以直接的方式获取数据,然后对查询结果进行一些繁重的编辑。 现在数据发送给调用者。

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

对于此自定义查询,我认为我应该添加自定义行为(spring.io、"Working with Spring Data Repositories"、第 1.3.1 节、"Adding custom behavior to single repositories")。

举个例子:

@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 获取我的输出并以我想要的输出格式发出它。

从这里到那里有什么简单的方法吗?或者我必须尝试在浏览器中进行过滤之类的操作吗?

谢谢, 杰罗姆

我不确定我是否完全理解你的问题。如果我这样做,答案应该是:http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations

要正确获取 HAL 格式的结果,您的查询控制器必须 return 某种形式的 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 数据 REST 提交了拉取请求,以更新其参考文档以在 http://docs.spring.io/spring-data/rest/docs/2.4.0.RELEASE/reference/html/#customizing-sdr.overriding-sdr-response-handlers

中指定