2016-03-04 107 views
3

我使用彈簧RestTemplate用於與web服務xml後端通信如下:如何在RestTemplate中使用多種響應類型?

ResponseEntity<MainDTO> dto = restTemplate.postForObject(url, postData, MainDTO.class); 

問題:後端可能無論是在故障的情況下與MainDTO響應爲正常數據或與ErrorDTO。但與HTTP 200

但我不知道哪個對象將前回來!不管怎麼說restTemplate要求我之前通過class類型。

所以,我怎麼能解析XML無論正常或錯誤豆?

旁註:我沒有web服務後端的任何控制。

回答

3

正如你所想的那樣,問題是後端應該返回錯誤與HTTP錯誤代碼,這就是他們在那裏。

但正如你說的,你沒有在後臺控制,所以你可以做的是首先把它作爲一個String

ResponseEntity<String> dto = restTemplate.postForObject(url, postData, String.class); 

然後你就可以嘗試解析字符串響應爲MainDTO與無論是傑克遜還是Gson(無論你在你的項目中有什麼,你應該這樣做,因爲我相信Spring的RestTemplate會在內部使用它們),如果它失敗了,那麼你試着用你的ErrorDto來解析它。

更新

哦,我剛纔讀,這是一個XML服務,而不是一個JSON,上面的方法仍然有效,但不是使用JacksonGson,您可以使用SimpleXMLhttp://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize)它允許您以一種「簡單」的方式對XML進行反序列化,您只需使用他們的教程示例中描述的註釋對註釋進行註釋。

這個春天的例子(http://spring.io/guides/gs/consuming-rest-xml-android/)也可能提供瞭如何使用SimpleXML的見解。

0

我有同樣的問題,所以我有一個描述錯誤的抽象類。所有我的Json類然後擴展了抽象的錯誤類。因此,響應對象填充了實體數據和一個可以輕鬆檢查的錯誤。

我不是特別喜歡這個解決方案,但是當我立即將Json對象轉換爲應用程序數據對象時,它並不覺得太糟糕。

0

使用INSTANCEOF

MyObject1 a=null; 
MyObject2 b=null; 
ResponseEntity<Object>response=template.exchange(builder.build().encode().toUri(),HttpMethod.GET,entity, Object.class); 
if (response.getBody() instanceof MyObject1) 
    a= (MyObject1) response.getBody(); 
else if(response.getBody() instanceof MyObject2) 
    b= (MyObject2) response.getBody(); 
相關問題