【问题标题】:How to prevent MappingJackson2XmlHttpMessageConverter from taking over serialization?如何防止 MappingJackson2XmlHttpMessageConverter 接管序列化?
【发布时间】: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?您是否尝试过为ContentNegotiationManagerContentNegotiatingViewResolver 配置您想要的优先级?
  • @Rodrigo,不是序列化错误的成员,而是整个对象。
  • 好的,但是java允许你将一个对象声明为transient,因此该对象不会被序列化。
  • @BrianKent:这不是针对 Spring MVC 和 providing REST 服务(而不是 消费)吗?我不认为内容协商对通过RestTemplate 进行的 REST 调用起作用...

标签: spring jackson resttemplate


【解决方案1】:

我可以看到两个选项:

  • 使用您想要的 HttpMessageConverter 创建一个RestTemplate,按照您希望它们使用的顺序(检查HttpEntityRequestCallback.doWithRequest,它们按照它们在列表中的顺序和第一个匹配 将使用转换器

  • 按照您的建议,使用 HttpEntity 并将 Content-Type 标头设置为您想要获取的 mime 类型。

我认为使用帮助器为您的对象创建 HttpEntity 和正确的 Content-Type 标头会更安全:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2011-05-29
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多