在我的restful webservice中,如果有错误请求(5xx)或4xx respose代码,我会在响应中写一个自定义标题“x-app-err-id”。
在客户端,我使用RestTemplate的交换方法进行RestFul Web服务调用。当响应代码为2xx时,一切都很好。
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
HttpMethod.POST,
requestEntity,
Component.class);
但是如果有一个异常(HttpStatusCodeException),因为它是一个错误的请求(5xx)或4xx,在HttpStatusCodeException的catch块中,我得到响应(见上文)为null,所以我没有访问我的我在我的网络服务中设置的自定义标题。如果RestTemplate中存在异常,如何从响应中获取自定义标头。
还有一个问题是,我在错误的情况下在响应主体中设置了一个错误对象(json),我想知道如何在RestTemplate中出现异常时访问响应主体
答案 0 :(得分:31)
我最终使用ResponseErrorHandler。
public class CustomResponseErrorHandler implements ResponseErrorHandler {
private static ILogger logger = Logger.getLogger(CustomResponseErrorHandler.class);
private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();
public void handleError(ClientHttpResponse response) throws IOException {
List<String> customHeader = response.getHeaders().get("x-app-err-id");
String svcErrorMessageID = "";
if (customHeader != null) {
svcErrorMessageID = customHeader.get(0);
}
try {
errorHandler.handleError(response);
} catch (RestClientException scx) {
throw new CustomException(scx.getMessage(), scx, svcErrorMessageID);
}
}
public boolean hasError(ClientHttpResponse response) throws IOException {
return errorHandler.hasError(response);
}
}
然后通过配置如下所示使用RestTemplate的自定义响应处理程序
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
</list>
</property>
<property name="errorHandler" ref="customErrorHandler" />
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes" value="application/json" />
</bean>
<bean id="customErrorHandler " class="my.package.CustomResponseErrorHandler">
</bean>
答案 1 :(得分:12)
您不必创建自定义错误处理程序。您可以从被抛出的HttpStatusCodeException中获取正文和标题。
try {
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
HttpMethod.POST,
requestEntity,
Component.class);
} catch (HttpStatusCodeException e) {
List<String> customHeader = e.getResponseHeaders().get("x-app-err-id");
String svcErrorMessageID = "";
if (customHeader != null) {
svcErrorMessageID = customHeader.get(0);
}
throw new CustomException(e.getMessage(), e, svcErrorMessageID);
// You can get the body too but you will have to deserialize it yourself
// e.getResponseBodyAsByteArray()
// e.getResponseBodyAsString()
}