【发布时间】:2014-12-19 17:10:03
【问题描述】:
我正在尝试做一些我认为应该非常简单的事情。我有一个Question 对象,使用 spring-boot、spring-data-rest 和 spring-hateoas 设置。所有的基础工作都很好。我想添加一个自定义控制器,它返回一个List<Question>,其格式与我的Repository 的/questions url 的GET 格式完全相同,以便两者之间的响应兼容。
这是我的控制器:
@Controller
public class QuestionListController {
@Autowired private QuestionRepository questionRepository;
@Autowired private PagedResourcesAssembler<Question> pagedResourcesAssembler;
@Autowired private QuestionResourceAssembler questionResourceAssembler;
@RequestMapping(
value = "/api/questions/filter", method = RequestMethod.GET,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody PagedResources<QuestionResource> filter(
@RequestParam(value = "filter", required = false) String filter,
Pageable p) {
// Using queryDSL here to get a paged list of Questions
Page<Question> page =
questionRepository.findAll(
QuestionPredicate.findWithFilter(filter), p);
// Option 1 - default resource assembler
return pagedResourcesAssembler.toResource(page);
// Option 2 - custom resource assembler
return pagedResourcesAssembler.toResource(page, questionResourceAssembler);
}
}
选项 1:依靠提供的 SimplePagedResourceAssembler
这个选项的问题是没有必要的_links 被渲染。如果有解决方案,这将是最简单的解决方案。
选项 2:实现我的开放资源汇编器
此选项的问题在于,根据Spring-Hateoas documentation 实现QuestionResourceAssembler 会导致QuestionResource 最终成为Question 的近重复项,然后汇编程序需要手动复制数据在这两个对象之间,我需要手动构建所有相关的_links。这似乎浪费了很多精力。
怎么办?
我知道 Spring 在导出 QuestionRepository 时已经生成了执行所有这些操作的代码。有什么方法可以利用该代码并使用它,以确保控制器的输出与生成的响应无缝且可互换?
【问题讨论】:
标签: spring spring-mvc spring-data spring-data-rest spring-hateoas