2015-09-21 106 views
0

我使用RestTemplate與幾個REST服務交互,其中一些接受/返回JSON和一些XML。爲此,我添加了Jackson's dataformat-xml module作爲依賴項(以及JAXB annotations module)。 RestTemplate自動包含MappingJackson2XmlHttpMessageConverter(在RestTemplate構造函數中完成)。如何防止MappingJackson2XmlHttpMessageConverter接管序列化?

這產生了被用作呼叫request參數

RestTemplate.postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)` 

某些對象得到serlialized如XML和內容類型設置爲application/xml請求的情況。例如:

MyObject request = ...; 
String url = ...; 
MyResponseObject response = restTemplate.postForObject(url, request, MyResponseObject.class); 

RestTemplate嘗試序列MyObject到XML並設置請求媒體類型application/xml

問題是,我們所稱的很多服務都不接受XML(他們期望JSON)。所以現在我在類路徑上有MappingJackson2XmlHttpMessageConverter,它優先於JSON轉換器,它使得對JSON服務的調用失敗。

我想我可以改變我的調用代碼來傳遞一個HttpEntity,而媒體類型顯式地設置爲JSON而不是我的簡單數據對象,但這有點醜陋(樣板),並且意味着改變了很多服務調用代碼。

有一種方法要麼

A)改變了MessageConverter的優先級,使得標準Jackons(JSON)一個以上MappingJackson2XmlHttpMessageConverter

B)防止MappingJackson2XmlHttpMessageConverter聲稱來自優先它可以序列化我不想要的物體

+0

設置變量'transient'? –

+1

什麼版本的Spring?你有沒有嘗試過以你想要的優先級配置一個'ContentNegotiationManager'或'ContentNegotiatingViewResolver'? –

+0

@Rodrigo,它不是一個錯誤序列化的成員,它是整個對象。 –

回答

1

我可以看到兩個選項:

  • 創建與HttpMessageConverter你想RestTemplate,在爲了你希望他們使用(檢查HttpEntityRequestCallback.doWithRequest按它們在列表中的順序使用,第一匹配轉換器將使用HttpEntity並設置Content-Type頭你想獲得MIME類型使用

  • 如你所說。

我認爲使用一個助手來創建一個HttpEntity與你的對象和正確的Content-Type頭會更安全:

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