Spring Data Rest: como registrar um conversionService personalizado com o Converter personalizado <Entidade, Recurso>?
Há algo que não é claro o suficiente emesta parte da documentação do Spring Data Rest:
O exportador Spring Data REST executa qualquer ResourceProcessor descoberto antes de criar a representação de saída.
Pelo que notei, é verdade: ResourceProcessor é chamado durante o tratamento da solicitação, após a conclusão do método respectivo RepositoryEntityController.
Faz isso registrando umConverter<Entity, Resource>
instância com um ConversionService interno.
Eu não entendo quando é usado issoConverter<Entity,Resource>
.
Este é o componente responsável pela criação dos links para as entidades referenciadas (por exemplo, os objetos sob a propriedade _links na representação JSON do objeto). Ele pega um @Entity e itera sobre suas propriedades, criando links para as propriedades gerenciadas por um Repositório e copiando quaisquer propriedades incorporadas ou simples.
Certo? Notei que o_links às entidades referenciadas são criadas noRepositoryEntityController
. Não vi nenhum outro componente que constrói esses links: nenhum ConversionService ou Converter está envolvido.
Se o seu projeto precisar ter saída em um formato diferente, no entanto, é possível substituir completamente a representação JSON de saída padrão pela sua. Se você registrar seu próprio ConversionService no ApplicationContext e registrar seu próprio conversor, poderá retornar uma implementação de recurso de sua escolha.
Não entendo como é possível fazer isso.
Tentei fazer exatamente o que está escrito na documentação: registrei meu próprio ConversionService no ApplicationContext e meu próprio conversor.
Registrei o ConversionService em uma classe personalizada que estende RepositoryRestMvcConfiguration:
@Configuration
public class RepositoryConfiguration extends RepositoryRestMvcConfiguration {
@Autowired
AuthorConverter authorConverter;
@Bean(name="conversionService")
public ConversionService getConversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
conversionService.addConverter(authorConverter);
return conversionService;
}
@Override
public DefaultFormattingConversionService defaultConversionService() {
return (DefaultFormattingConversionService) getConversionService();
}
}
Este é o AuthorConverter:
@Component
public class AuthorConverter implements Converter<Author, Resource> {
@Override
public Resource convert(Author source) {
System.out.println("convert method of class AuthorConverter");
// still to be implemented
return null;
}
}
Mas o conversor nunca é usado: se eu for o/authors
url, o JSON é resolvido como a representação padrão e o método "convert" do conversor nunca é chamado.
Eu quero entender (possivelmente com um exemplo de trabalho) como ter um conversor personalizado envolvido no processo de representação de saída.
Obrigado.