gpt4 book ai didi

java - Spring RestTemplate 消息转换器在发布时的优先级

转载 作者:IT老高 更新时间:2023-10-28 13:47:33 27 4
gpt4 key购买 nike

在使用 RestTemplate 进行 POST 时,影响 Spring 应用的消息转换器优先级的最方便的方法是什么?

用例:我想确保给定实体以 JSON 形式发布,而不是例如XML 当我做 restTemplate.postForEntity(url, entity, Void.class).

默认

默认情况下,实体会转换为 XML,因为 MappingJackson2XmlHttpMessageConverter 优先于 MappingJackson2HttpMessageConverter。我的应用程序的默认转换器列表似乎是(Spring 扫描类路径以查看可用的内容): enter image description here

选项 1

您可以为给定的 RestTemplate 实例显式配置消息转换器,例如 restTemplate.setMessageConverters(Lists.newArrayList(new MappingJackson2HttpMessageConverter()))。如果实例是共享的(例如作为 Spring bean),这很不方便,因为您可能在一种情况下需要转换器 X,而在另一种情况下需要转换器 Y。

选项 2

您可以显式设置 AcceptContent-Type HTTP header ,在这种情况下 Spring 将使用匹配的消息转换器。缺点是你必须求助于 RestTemplate.exchange 而不是 RestTemplate.postForEntity 这意味着:额外的代码,不太方便。

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity requestEntity = new HttpEntity(entity, requestHeaders);
restTemplate.exchange(url, HttpMethod.POST, requestEntity, Void.class);

选项 3

这可能就是我要找的:)

最佳答案

这个问题详细解答here .

基本上,当您添加下面提到的库时,它会在 MappingJackson2HttpMessageConverter 之前添加 MappingJackson2XmlHttpMessageConverter。因此,Spring boot 假定每个请求都接受 application/XML

 <dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

为避免这种行为,您可能需要交换两个消息转换器。

例子:

  @Bean
RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// move XML converter to the end of list
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
for (int i = 0; i < messageConverters.size() -1 ; i++) {
if (messageConverters.get(i) instanceof MappingJackson2XmlHttpMessageConverter) {
Collections.swap(messageConverters, i,messageConverters.size() - 1);
}
}

restTemplate.setMessageConverters(messageConverters);

// add interceptors if necessary
restTemplate.setInterceptors(Collections.singletonList(catalogInterceptior()));
return restTemplate;

}

关于java - Spring RestTemplate 消息转换器在发布时的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47894619/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com