【问题标题】:With Spring Data REST, how to make custom queries use the HATEOAS output format?使用 Spring Data REST,如何使自定义查询使用 HATEOAS 输出格式?
【发布时间】:2015-09-18 03:24:50
【问题描述】:

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

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

对于这个自定义查询,我认为我应该添加自定义行为(spring.io,“使用 Spring 数据存储库”,第 1.3.1 节,“将自定义行为添加到单个存储库”)。

举个例子:

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

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

谢谢, 杰罗姆。

【问题讨论】:

    标签: spring-data spring-hateoas


    【解决方案1】:

    要正确获得 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 中指定这一点

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您的参考与我在问题中提到的非常相似。我知道我可以通过这种方式编写我的查询。我不明白 HATEOAS 格式是如何连接到结果中的。我开始觉得,在最简单的示例中,Spring 数据库实际上是由 Spring servlet 直接调用的。或许我终究还是要试验一下。
      猜你喜欢
      • 1970-01-01
      • 2018-07-23
      • 2015-03-08
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多