RestTemplate设置超时时间及返回状态码非200处理
默认情况下使用RestTemplate如果返回结果的状态码是200的话就正常处理,否则都会抛出异常;
1.调试postForEntity请求
调试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; }zhi
只需要将hasError方法的返回值更改为true就可以了,以后不管状态码是200还是其它的都会返回结果;
2.设置超时时间
RestTemplate默认使用的是SimpleClientHttpRequestFactory工厂方法,看下它的超时时间是:
private int connectTimeout = -1; private int readTimeout = -1;
默认值都是-1,也就是没有超时时间;
其底层是使用URLConnection,而URLConnection实际上时封装了Socket,Socket我们知道是没有超时时间限制的,所以我们必须设置超时时间,否则如果请求的URL一直卡死程序将会不可以运行下去;
@Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); //读取超时5秒,默认无限限制,单位:毫秒 factory.setReadTimeout(5000); //连接超时10秒,默认无限制,单位:毫秒 factory.setConnectTimeout(10000); return factory; }
以上就是RestTemplate设置超时时间及返回状态码非200处理的详细内容,更多关于RestTemplate超时设置非200处理的资料请关注脚本之家其它相关文章!
相关文章
Java SpringBoot集成文件之如何使用POI导出Word文档
这篇文章主要介绍了Java SpringBoot集成文件之如何使用POI导出Word文档,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下2022-08-08SpringBoot中使用websocket出现404的解决方法
在Springboot中使用websocket时,本地开发环境可以正常运行,但部署到服务器环境出现404问题,所以本文小编讲给大家详细介绍一下SpringBoot中使用websocket出现404的解决方法,需要的朋友可以参考下2023-09-09使用IDEA异常断点来定位java.lang.ArrayStoreException的问题
这篇文章主要介绍了使用IDEA异常断点来定位java.lang.ArrayStoreException的问题,平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理,下面我们来一起学习一下吧2019-06-06
最新评论