如何将RestTemplate与多种响应类型一起使用?

我正在使用spring RestTemplatexml webservice后端进行通信,如下所示:

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

问题:后端可以使用MainDTO响应正常数据,也可以使用MainDTO响应失败。 但是两者都使用HTTP 200

但我不知道之前会有哪些物体回来! 无论如何restTemplate要求我之前传递class类型。

那么,我怎么能将xml解析为普通或错误bean?

旁注:我对webservice后端没有任何控制权。

正如您所想,问题是后端应该使用HTTP错误代码返回错误,这就是它们的用途。

但正如你所说,你无法控制后端,所以你能做的就是先把它作为一个字符串

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

然后你可以尝试用Jackson或Gson(你应该在项目中拥有的任何东西,你应该,因为我相信Spring的RestTemplate在内部使用其中任何一个)和try / catch以及它是否失败时将字符串响应解析为MainDTO ,然后你尝试用你的ErrorDto解析它。

更新

哦,我刚刚读到它是一个XML服务,而不是JSON ,上面的方法仍然有效,但是你可以使用SimpleXMLhttp://simple.sourceforge.net/download/stream)而不是使用JacksonGson 。 /doc/tutorial/tutorial.php#deserialize )允许您以“简单”的方式反序列化XML,您只需要使用他们的教程示例中描述的注释来注释您的模型。

这个Spring的例子( http://spring.io/guides/gs/consuming-rest-xml-android/ )也可以提供有关如何使用SimpleXML的见解。

您可以实现一个自定义的ResponseErrorHandler ,它将错误的响应转换为RuntimeException 。 可以通过重用RestTemplate#setMessageConverters正在使用的messageConverter来完成向POJO转换的Http消息。

我有同样的问题所以我有一个描述错误的抽象类。 然后我的所有Json类都扩展了抽象错误类。 因此响应对象填充了实体数据和我可以轻松检查的错误。

我并不特别喜欢这个解决方案,但是当我立即将Json对象转换为应用程序数据对象时,它并不会感觉太糟糕。

使用 Instanceof

 MyObject1 a=null; MyObject2 b=null; ResponseEntityresponse=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();