我正在使用spring RestTemplate
与xml
webservice后端进行通信,如下所示:
ResponseEntity<MainDTO> dto = restTemplate.postForObject(url, postData, MainDTO.class);
问题:后端可能会使用MainDTO
来回复正常数据,也可以回复ErrorDTO
以防出现故障。但都是HTTP 200
。
但我不知道之前会回来哪个对象!无论如何restTemplate
要求我之前传递class
类型。
那么,我怎样才能将xml解析为普通或错误bean?
旁注:我对webservice后端没有任何控制权。
答案 0 :(得分:4)
正如您所想,问题是后端应该使用HTTP错误代码返回错误,这就是它们的用途。
但正如你所说,你无法控制后端,所以你能做的就是先把它作为一个字符串
ResponseEntity<String> dto = restTemplate.postForObject(url, postData, String.class);
然后你可以尝试用Jackson或Gson解析字符串响应MainDTO
(无论你在项目中有什么,你应该这样做,因为我相信Spring的RestTemplate使用它们中的任何一个在内部)使用try / catch,如果失败,则尝试使用ErrorDto
解析它。
<强>更新强>
哦,我刚看到它是XML
服务,而不是JSON
,上述方法仍然有效,但不是使用Jackson
或Gson
,您可以使用SimpleXML
(http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize),它允许您在&#34; easy&#34;中反序列化XML。方式,您只需要使用他们的教程和示例中描述的注释来注释您的模型。
这个Spring的例子(http://spring.io/guides/gs/consuming-rest-xml-android/)也可以提供有关如何使用SimpleXML
的见解。
答案 1 :(得分:2)
You could implement a custom ResponseErrorHandler
将错误的响应转换为RuntimeException
时,如何将表格传递到另一个页面。
可以通过重用RestTemplate#setMessageConverters
正在使用的messageConverter来完成向POJO转换的Http消息。
答案 2 :(得分:1)
我遇到了同样的问题,我这样解决了它:
我创建了一个Response类,并在其中放置了两个响应对象。 我已经用
记下了所有三个类@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
ResponseEntity <Response> responseEntity = restTemplate.postForEntity (url, request, Response.class);
Object res = responseEntity.getBody ();
if (res! = null) {
if (res instanceof MainDTO) {
...
} else if (res instanceof ErrorDTO) {
...
}
}
希望它有用!
答案 3 :(得分:0)
我有同样的问题所以我有一个描述错误的抽象类。然后我的所有Json类都扩展了抽象错误类。因此响应对象填充了实体数据和我可以轻松检查的错误。
我并不特别喜欢这个解决方案,但是当我立即将Json对象转换为应用程序数据对象时,它感觉不太糟糕。
答案 4 :(得分: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();
答案 5 :(得分:0)
我尝试了Alfredo's solution,但是由于Object.class而获得了异常:
td
如果您使用其他类,则将强制转换该类,而您将无法使用该类的实例。
使用以下代码解决了我的问题:
Method threw 'org.springframework.web.client.HttpClientErrorException' exception.