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

时间:2016-03-04 13:50:27

标签: java spring spring-rest

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

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

问题:后端可能会使用MainDTO来回复正常数据,也可以回复ErrorDTO以防出现故障。但都是HTTP 200

但我不知道之前会回来哪个对象!无论如何restTemplate要求我之前传递class类型。

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

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

6 个答案:

答案 0 :(得分:4)

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

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

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

然后你可以尝试用Jackson或Gson解析字符串响应MainDTO(无论你在项目中有什么,你应该这样做,因为我相信Spring的RestTemplate使用它们中的任何一个在内部)使用try / catch,如果失败,则尝试使用ErrorDto解析它。

<强>更新

哦,我刚看到它是XML服务,而不是JSON,上述方法仍然有效,但不是使用JacksonGson ,您可以使用SimpleXMLhttp://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.