2016-03-04 48 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(); 
相关问题