使用 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
中指定
我正在通过转换现有的 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
中指定