我试图做一件我认为非常简单的事情。我有一个使用spring-boot、spring-data-rest和spring-hateoas设置的Question
对象。所有基本功能都正常工作。我想添加一个自定义控制器,返回一个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文档实现QuestionResourceAssembler
会导致QuestionResource
几乎成为Question
的副本,然后汇编器需要手动在两个对象之间复制数据,我需要手动构建所有相关的_links
。这似乎浪费了很多精力。
该怎么办?
我知道当Spring导出QuestionRepository
时已经生成了完成所有这些操作的代码。是否有任何方法可以利用那些代码并使用它们,以确保我的控制器输出与生成的响应无缝交换?
_embedded
键,不像自动生成的REST/HATEOAS控制器。 我必须手动调用pagedResourcesAssembler.toEmptyResource
来处理这种情况。 - alalonde_embedded
。 - Hubert GrzeskowiakPersistentEntityResourceAssembler
失败。它会报错java.lang.IllegalArgumentException: entities is marked @NonNull but is null
。 - Jefferson Lima