我正在尝试做一些我认为应该非常简单的事情。我有一个Question
对象,使用 spring-boot、spring-data-rest 和 spring-hateoas 设置。所有的基础工作都很好。我想添加一个自定义控制器,它以与 GET 到 my的urlList<Question>
完全相同的格式返回 a ,以便两者之间的响应兼容。Repository
/questions
这是我的控制器:
@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:实现我的开放资源汇编器
这个选项的问题在于,QuestionResourceAssembler
根据Spring-Hateoas 文档实现会导致一条路径QuestionResource
接近于 的重复Question
,然后汇编器需要在两个对象之间手动复制数据,我需要构建所有相关_links
的手工。这似乎浪费了很多精力。
该怎么办?
我知道 Spring 在导出QuestionRepository
. 有什么方法可以利用该代码并使用它,以确保我的控制器的输出是无缝的并且可以与生成的响应互换?