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.

questionAnswers(1)

yourAnswerToTheQuestion