问题描述
默认情况下,在使用spring的restTemplate调用接口,如果响应的http状态码是200则会成功返回数据。但是有些时候对方接口返回错误或失败的情况设置了非200的http状态码导致默认的restTemplate调用直接抛异常而不是直接得到对方的错误json信息。
RestTemplate源码分析
1.调试postForEntity请求的方法找到判断响应结果状态码的方法是org.springframework.web.client.DefaultResponseErrorHandler类中的hasError方法
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
int rawStatusCode = response.getRawStatusCode();
HttpStatus statusCode = HttpStatus.resolve(rawStatusCode);
return (statusCode != null ? hasError(statusCode) : hasError(rawStatusCode));
}
代码再往上跟踪一级,如下:
protected void handleResponse(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
ResponseErrorHandler errorHandler = getErrorHandler();
boolean hasError = errorHandler.hasError(response);
if (logger.isDebugEnabled()) {
try {
int code = response.getRawStatusCode();
HttpStatus status = HttpStatus.resolve(code);
logger.debug("Response " + (status != null ? status : code));
}
catch (IOException ex) {
// ignore
}
}
if (hasError) {
errorHandler.handleError(url, method, response);
}
}
从上面的代码可以看到是使用了RestTemplate的错误处理器,所以解决思路就是可以想办法自定义错误处理器;
解决/处理办法
自定义错误处理器如下所示
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
RestTemplate restTemplate = new RestTemplate(factory);
ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return true;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
}
};
restTemplate.setErrorHandler(responseErrorHandler);
return restTemplate;
}
注意说明
1.hasError默认写死true,都进;
2.handleError 为空,相当于跳过错误抛出
配置上方代码,以后不管状态码是200还是其它的都会返回结果
原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/243871.html