Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何防止MappingJackson2XmlHttpMessageConverter接管序列化?_Spring_Jackson_Resttemplate - Fatal编程技术网

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);
    }
}