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處理的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- RestTemplate自定義ErrorHandler方式
- 解決使用RestTemplate時報錯RestClientException的問題
- 解決RestTemplate第一次請求響應速度較慢的問題
- java實用型-高並發下RestTemplate的正確使用說明
- 關於RestTemplate的使用深度解析