我正在尝试做一些我认为应该非常简单的事情。我有一个Question
对象,使用 spring-boot、spring-data-rest 和 spring-hateoas 设置。所有的基础工作都很好。我想添加一个返回一个的自定义控制器List<Question>
与 GET 到我的格式完全相同Repository
's /questions
url 这样做,以便两者之间的响应兼容。
这是我的控制器:
@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 文档 https://github.com/spring-projects/spring-hateoas引向一条道路,其中QuestionResource
最终几乎是重复的Question
,然后汇编器需要在两个对象之间手动复制数据,我需要构建所有相关的_links
用手。这看起来像是浪费了很多精力。
该怎么办?
我知道 Spring 在导出时已经生成了执行所有这些操作的代码QuestionRepository
。有什么方法可以利用该代码并使用它,以确保控制器的输出是无缝的并且可以与生成的响应互换?