发布时Spring RestTemplate消息转换器优先级

Mar*_*tör 11 java spring resttemplate

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

使用案例:我想确保给定的实体作为JSON而不是例如XML进行POST restTemplate.postForEntity(url, entity, Void.class).

默认

默认情况下,实体将转换为XML,因为MappingJackson2XmlHttpMessageConverter它优先于MappingJackson2HttpMessageConverter.我的应用程序的默认转换器列表似乎是(Spring扫描类路径以查看可用的内容): 在此输入图像描述

选项1

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

选项2

您可以设置AcceptContent-TypeHTTP头文件明确在这种情况下,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);
Run Code Online (Sandbox Code Playgroud)

选项3

这可能是我正在寻找的:)

小智 1

根据Spring javadoc(https://docs.spring.io/spring-framework/docs/current/javadoc-api/index.html?org/springframework/web/client/RestTemplate.html),您仍然可以使用postForEntity,

public <T> ResponseEntity<T> postForEntity(java.lang.String url,
                                       @Nullable
                                       java.lang.Object request,
                                       java.lang.Class<T> responseType,
                                       java.util.Map<java.lang.String,?> uriVariables)
                                throws RestClientException
....
Run Code Online (Sandbox Code Playgroud)

request参数可以是 a HttpEntity,以便向请求添加额外的 HTTP 标头。