我通过转换现有的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接受我的输出并以我想要的输出格式发出它。
有没有一种简单的方法从这里到达那里?或者我必须尝试在浏览器中进行过滤吗?
谢谢, 杰罗姆。
答案 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
中指定此内容