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
您可以设置Accept和Content-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 标头。