在我的 Restful Web 服务中,如果出现错误请求 (5xx) 和 4xx 响应代码,我会在响应中写入自定义标头“x-app-err-id”。
在客户端,我使用 RestTemplate 的交换方法来进行 RestFul Web 服务调用。当响应代码为 2xx 时一切正常。
ResponseEntity<Component> response = restTemplate.exchange(webSvcURL,
HttpMethod.POST,
requestEntity,
Component.class);
但是,如果由于错误请求(5xx)或 4xx 而出现异常(HttpStatusCodeException),则在 HttpStatusCodeException 的 catch 块中,我得到的响应(见上文)为 null,因此我无权访问我的自定义标头在我的网络服务中设置。如果 RestTemplate 中出现异常,如何从响应中获取自定义标头。
还有一个问题是,我在响应正文中设置了一个错误对象(json),以防出现错误,并且我想知道如何在 RestTemplate 中出现异常时访问响应正文
我最终使用 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)