Spring Data Rest:如何使用自定义Converter <entity,resource =“”>注册自定义conversionService?

时间:2016-07-27 11:16:30

标签: spring spring-mvc spring-data-rest

在Spring Data Rest文档的this part中有一些不够清楚的东西:

  

Spring Data REST导出器执行任何已发现的   ResourceProcessor在创建输出表示之前。

对于我所注意到的,它是真的:在RepositoryEntityController各自的方法完成之后,在处理请求期间调用ResourceProcessor。

  

通过注册Converter<Entity, Resource>实例来实现此目的   使用内部ConversionService。

我不明白何时使用此Converter<Entity,Resource>

  

这是负责创建引用链接的组件   实体(例如对象中_links属性下的那些对象)   JSON表示)。需要@Entity并迭代它   属性,为由a管理的属性创建链接   存储和复制任何嵌入或简单的属性。

不确定?我注意到RepositoryEntityController创建了 _links 到引用的实体。我没有看到构建这些链接的任何其他组件:没有涉及ConversionService或Converter。

  

但是,如果您的项目需要以不同的格式输出,   可以完全替换默认的传出JSON   用你自己的代表。如果您注册自己的   ApplicationContext中的ConversionService并注册您自己的   转换器,然后你可以返回一个资源   实施您的选择。

我不知道怎么可能这样做。

我试图完全按照文档中的内容进行操作:我在ApplicationContext和我自己的Converter中注册了自己的ConversionService。

我已在扩展RepositoryRestMvcConfiguration的自定义类中注册了ConversionService:

@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();
    }
}

这是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;
    }

}

但转换器从未使用过:如果我使用/authors url,则JSON将作为标准表示求解,并且永远不会调用转换器的“convert”方法。

我想了解(可能有一个工作示例)如何使用自定义转换器参与输出表示的过程。

感谢。

1 个答案:

答案 0 :(得分:0)

这篇文章有帮助吗? 资料来源:http://www.baeldung.com/spring-httpmessageconverter-rest

“我们可以通过扩展WebMvcConfigurerAdapter类并覆盖configureMessageConverters方法来自定义消息转换器:

@EnableWebMvc
@Configuration
@ComponentScan({ "org.baeldung.web" })
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(
      List<HttpMessageConverter<?>> converters) {

        messageConverters.add(createXmlHttpMessageConverter());
        messageConverters.add(new MappingJackson2HttpMessageConverter());

        super.configureMessageConverters(converters);
    }
    private HttpMessageConverter<Object> createXmlHttpMessageConverter() {
        MarshallingHttpMessageConverter xmlConverter = 
          new MarshallingHttpMessageConverter();

        XStreamMarshaller xstreamMarshaller = new XStreamMarshaller();
        xmlConverter.setMarshaller(xstreamMarshaller);
        xmlConverter.setUnmarshaller(xstreamMarshaller);

        return xmlConverter;
    }
}