【发布时间】:2014-04-16 10:55:10
【问题描述】:
给定一个 REST 服务调用
http://acme.com/app/widget/123
返回:
<widget>
<id>123</id>
<name>Foo</name>
<manufacturer>Acme</manufacturer>
</widget>
此客户端代码有效:
RestTemplate restTemplate = new RestTemplate();
XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
xStreamMarshaller.getXStream().processAnnotations(
new Class[] {
Widget.class,
ErrorMessage.class
});
HttpMessageConverter<?> marshallingConverter = new MarshallingHttpMessageConverter(
xStreamMarshaller, xStreamMarshaller);
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
converters.add(marshallingConverter);
restTemplate.setMessageConverters(converters);
Widget w = restTemplate.getForObject(
"http://acme.com/app/widget/{id}", Widget.class, 123L);
但是,调用 http://acme.com/app/widget/456 会返回:
<error>
<message>Widget 456 does not exist</message>
<timestamp>Wed, 12 Mar 2014 10:34:37 GMT</timestamp>
</error>
但是这个客户端代码抛出异常:
Widget w = restTemplate.getForObject(
"http://acme.com/app/widget/{id}", Widget.class, 456L);
org.springframework.web.client.HttpClientErrorException: 404 Not Found
我试过了:
try {
Widget w = restTemplate.getForObject(
"http://acme.com/app/widget/{id}", Widget.class, 456L);
}
catch (HttpClientErrorException e) {
ErrorMessage errorMessage = restTemplate.getForObject(
"http://acme.com/app/widget/{id}", ErrorMessage.class, 456L);
// etc...
}
第二次调用只是抛出了另一个 HttpClientErrorException,而且两次调用服务感觉不对。
有没有办法调用一次服务并将响应解析为成功时的 Widget 和未找到时的 ErrorMessage?
【问题讨论】:
-
我不确定您为什么担心从 XML 响应中获取确切的错误消息,因为它实际上与 HTTP 404 相同 - 未找到。只需捕获 404 并抛出新异常或生成您自己的消息等。
-
如果此自定义消息被成功解析,我知道小部件未找到与服务已关闭或正在为服务调用错误的 URL。
-
很公平,虽然“服务中断”应该是不同的代码 (500)。此时我将开始阅读 RestTemplate 的源代码...,您确定 HTTP 正文没有存储在
HttpClientErrorException的某处吗? -
您可以访问下面的线程。它有完整的工作代码和描述:stackoverflow.com/a/51805956/3073945
标签: rest spring-mvc