在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”方法。
我想了解(可能有一个工作示例)如何使用自定义转换器参与输出表示的过程。
感谢。
答案 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;
}
}