leftso 86 0 2021-10-11
版权申明:本文为博主原创文章,未经博主允许不得转载。 https://www.leftso.com/blog/912.html

问题描述

默认情况下,在使用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还是其它的都会返回结果

 
提示:本文最后更新于【 2021-10-11 10:11:11 】,某些文章具有时效性,若有错误或已失效,请在下方留言

评论区域