Posso fazer um controlador personalizado espelhar a formatação das classes geradas pelo Spring-Data-Rest / Spring-Hateoas?
Estou tentando fazer algo que acho que deve ser realmente simples. eu tenho umQuestion
objeto, configuração com spring-boot, spring-data-rest e spring-hateoas. Todos os princípios funcionam bem. Gostaria de adicionar um controlador personalizado que retorne umList<Question>
exatamente no mesmo formato que um GET para o meuRepository
é/questions
url, para que as respostas entre os dois sejam compatíveis.
Aqui está o meu controlador:
@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);
}
}
Opção 1: conte com oSimplePagedResourceAssembler
O problema com esta opção não é dos necessários_links
são renderizados. Se houvesse uma correção para isso, seria a solução mais fácil.
Opção 2: implementar meu assembler de recursos abertos
O problema com esta opção é que a implementaçãoQuestionResourceAssembler
de acordo comDocumentação Spring-Hateoas leva por um caminho onde oQuestionResource
acaba sendo uma quase duplicata deQuestion
, e o montador precisa copiar manualmente os dados entre os dois objetos, e eu preciso criar todos os_links
à mão. Isso parece muito esforço desperdiçado.
O que fazer?
Eu sei que o Spring já gerou o código para fazer tudo isso quando exporta oQuestionRepository
. Existe alguma maneira de usar esse código e usá-lo para garantir que a saída do meu controlador seja contínua e intercambiável com as respostas geradas?