Spring 如何防止MappingJackson2XmlHttpMessageConverter接管序列化?
我使用Spring 如何防止MappingJackson2XmlHttpMessageConverter接管序列化?,spring,jackson,resttemplate,Spring,Jackson,Resttemplate,我使用restemplate与几个REST服务交互,其中一些接受/返回JSON和一些XML。为此,我添加了一个依赖项(以及)RestTemplate自动包括MappingJackson2XmlHttpMessageConverter(在RestTemplate构造函数中完成) 这会造成这样一种情况,即在调用中使用一些对象作为请求参数 RestTemplate.postForObject(String url, Object request, Class<T> responseType
restemplate
与几个REST服务交互,其中一些接受/返回JSON和一些XML。为此,我添加了一个依赖项(以及)RestTemplate
自动包括MappingJackson2XmlHttpMessageConverter
(在RestTemplate
构造函数中完成)
这会造成这样一种情况,即在调用中使用一些对象作为请求
参数
RestTemplate.postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)`
restemplate
尝试将MyObject
序列化为XML,并将请求媒体类型设置为application/XML
问题是,我们调用的许多服务不接受XML(它们需要JSON)。现在我在类路径上有了MappingJackson2XmlHttpMessageConverter
,它优先于JSON转换器,这使得对JSON服务的调用失败
我想我可以将调用代码更改为传递一个HttpEntity
,并将媒体类型显式设置为JSON,而不是简单的数据对象,但这有点难看(样板),意味着要更改很多服务调用代码
有什么办法可以做到这一点吗
A) 更改MessageConverter的优先级,使标准Jackons(JSON)优先于MappingJackson2XmlHttpMessageConverter
或
B) 防止MappingJackson2XmlHttpMessageConverter
声称它可以序列化我不希望它序列化的对象
?我可以看到两个选项:
- 使用所需的HttpMessageConverter,按照使用顺序创建一个
(选中RestTemplate
它们按照列表中的顺序使用,并且将使用第一个匹配的转换器HttpEntityRequestCallback.doWithRequest
- 正如您所建议的,使用
,并将HttpEntity
头设置为要获取的mime类型内容类型
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);
}
}
公共类HttpEntityHelper{
公共静态HttpEntity jsonHttpEntity(T体){
多值映射头=新的LinkedMultiValueMap();
headers.add(HttpHeaders.CONTENT\u TYPE、MediaType.APPLICATION\u JSON\u VALUE);
返回新的HttpEntity(主体、标题);
}
}
将变量设置为transient
?Spring的哪个版本?您是否尝试过配置ContentNegotiationManager
或ContentNegotingViewResolver
以您想要的优先级?@Rodrigo,不是错误序列化的成员,而是整个对象。好的,但java允许您将对象声明为transient
,因此该对象不会被序列化。@BrianKent:这不是针对Spring MVC并提供REST服务(与消费相反)的吗?我不认为内容协商通过RestTemplate
对REST调用起作用。。。
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);
}
}