Spring Data Rest:如何使用自定义 Converter<Entity, Resource> 注册自定义转换服务?

Ale*_*o C 5 spring spring-mvc spring-data-rest

在Spring Data Rest 文档的这一部分中有一些不够清楚的地方:

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

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

它通过Converter<Entity, Resource>向内部 ConversionService注册一个实例来实现这一点。

我不明白什么时候使用 this Converter<Entity,Resource>

这是负责创建指向引用实体(例如,对象的 JSON 表示中 _links 属性下的那些对象)的链接的组件。它接受一个@Entity 并迭代它的属性,为那些由 Repository 管理的属性创建链接,并在任何嵌入的或简单的属性之间进行复制。

当然?我注意到引用实体的_links是在RepositoryEntityController. 我没有看到构建这些链接的任何其他组件:不涉及 ConversionService 或 Converter。

但是,如果您的项目需要以不同格式输出,则可以用您自己的格式完全替换默认的传出 JSON 表示。如果您在 ApplicationContext 中注册您自己的 ConversionService 并注册您自己的 Converter,那么您可以返回您选择的 Resource 实现。

我不明白怎么可能做到这一点。

我试图完全按照文档中所写的去做:我已经在 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

但是转换器从未使用过:如果我访问/authorsurl,则 JSON 将作为标准表示进行解析,并且转换器的“convert”方法永远不会被调用。

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

谢谢。

Rob*_*ert 1

这篇文章有帮助吗?资料来源: 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;
    }
}
Run Code Online (Sandbox Code Playgroud)