【发布时间】:2015-09-21 19:49:22
【问题描述】:
我正在使用RestTemplate 与多个 REST 服务进行交互,其中一些接受/返回 JSON 和一些 XML。为此,我添加了Jackson's dataformat-xml module 作为依赖项(连同JAXB annotations module)。 RestTemplate 自动包含 MappingJackson2XmlHttpMessageConverter(在 RestTemplate 构造函数中完成)。
这会造成一些对象在调用时用作request 参数
RestTemplate.postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)`
序列化为 XML,请求的内容类型设置为application/xml。例如:
MyObject request = ...;
String url = ...;
MyResponseObject response = restTemplate.postForObject(url, request, MyResponseObject.class);
RestTemplate 尝试将MyObject 序列化为 XML 并将请求媒体类型设置为 application/xml。
问题是,我们调用的许多服务不接受 XML(它们需要 JSON)。所以现在我在类路径中有MappingJackson2XmlHttpMessageConverter,它优先于导致对 JSON 服务的调用失败的 JSON 转换器。
我想我可以更改调用代码以传递 HttpEntity 并将媒体类型显式设置为 JSON 而不是我的简单数据对象,但这有点难看(样板文件)并且意味着更改相当多的服务调用代码.
有没有办法
A) 更改 MessageConverters 的优先级,以便标准 Jackons (JSON) 优先于 MappingJackson2XmlHttpMessageConverter
或
B) 防止MappingJackson2XmlHttpMessageConverter 声称它可以序列化我不想要的对象
?
【问题讨论】:
-
设置变量为
transient? -
什么版本的 Spring?您是否尝试过为
ContentNegotiationManager或ContentNegotiatingViewResolver配置您想要的优先级? -
@Rodrigo,不是序列化错误的成员,而是整个对象。
-
好的,但是java允许你将一个对象声明为
transient,因此该对象不会被序列化。 -
@BrianKent:这不是针对 Spring MVC 和 providing REST 服务(而不是 消费)吗?我不认为内容协商对通过
RestTemplate进行的 REST 调用起作用...
标签: spring jackson resttemplate