如何将RestTemplate与多种响应类型一起使用?
我正在使用spring RestTemplate
与xml
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
,上面的方法仍然有效,但是你可以使用SimpleXML
( http://simple.sourceforge.net/download/stream)而不是使用Jackson
或Gson
。 /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; ResponseEntity