spring - 如何防止 MappingJackson2XmlHttpMessageConverter 接管序列化?

标签 spring jackson resttemplate

我正在使用 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/

相关文章:

java - Spring 3 和 Spring 4 的 Swagger 版本

java - 在构建 spring boot 应用程序时排除一些测试类

java - FlatFileItemReader 制表符分隔符不起作用

java - jackson :@JsonIdentityInfo 对象而不是 id

java - 创建文件 [...] : Instantiation of bean failed (NullPointerException) 中定义的名称为 'db' 的 bean 时出错

java - 使用 Jackson 的两个不同 JSON 的一个 POJO

java - Jackson 自定义序列化器在可选 <?> 中使用

java - 通过 JSON 中的 RestTemplate POST 请求

java - ClassCastException:RestTemplate 返回 List<LinkedHashMap> 而不是 List<MymodelClass>

java - 如何使用 spring webClient 等待所有 http 请求完成?