我正在使用 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 服务的调用失败。
我想我可以更改我的调用代码以传递媒体类型显式设置为 JSON 的 HttpEntity
而不是我的简单数据对象,但这有点丑陋(样板文件),并且意味着要进行相当大的更改一些服务调用代码。
有没有办法实现
A) 更改 MessageConverter 的优先级,以便标准 Jackons (JSON) 优先于 MappingJackson2XmlHttpMessageConverter
或
B) 防止 MappingJackson2XmlHttpMessageConverter
声称它可以序列化我不希望它序列化的对象
?
最佳答案
我可以看到两个选项:
使用您想要的 HttpMessageConverter 创建一个
RestTemplate
,按照您希望使用它们的顺序(检查HttpEntityRequestCallback.doWithRequest
它们按照它们的使用顺序位于列表中,并且将使用第一个匹配转换器按照您的建议,使用
HttpEntity
并将Content-Type
header 设置为您想要获取的 mime 类型。
我认为使用帮助程序使用您的对象和正确的 Content-Type header 创建 HttpEntity
会更安全:
public class HttpEntityHelper {
public static <T> HttpEntity<T> jsonHttpEntity(T body) {
MultiValueMap<String, String> headers = new LinkedMultiValueMap();
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
return new HttpEntity(body, headers);
}
}
关于spring - 如何防止 MappingJackson2XmlHttpMessageConverter 接管序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703367/