RestTemplate設(shè)置超時時間及返回狀態(tài)碼非200處理
默認(rèn)情況下使用RestTemplate如果返回結(jié)果的狀態(tài)碼是200的話就正常處理,否則都會拋出異常;
1.調(diào)試postForEntity請求
調(diào)試postForEntity請求的方法找到判斷響應(yīng)結(jié)果狀態(tài)碼的方法是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就可以了,以后不管狀態(tài)碼是200還是其它的都會返回結(jié)果;
2.設(shè)置超時時間
RestTemplate默認(rèn)使用的是SimpleClientHttpRequestFactory工廠方法,看下它的超時時間是:
private int connectTimeout = -1; private int readTimeout = -1;
默認(rèn)值都是-1,也就是沒有超時時間;
其底層是使用URLConnection,而URLConnection實(shí)際上時封裝了Socket,Socket我們知道是沒有超時時間限制的,所以我們必須設(shè)置超時時間,否則如果請求的URL一直卡死程序?qū)豢梢赃\(yùn)行下去;
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//讀取超時5秒,默認(rèn)無限限制,單位:毫秒
factory.setReadTimeout(5000);
//連接超時10秒,默認(rèn)無限制,單位:毫秒
factory.setConnectTimeout(10000);
return factory;
}
以上就是RestTemplate設(shè)置超時時間及返回狀態(tài)碼非200處理的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate超時設(shè)置非200處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
多線程-lock與lockInterruptibly的區(qū)別及說明
文章主要討論了Java中ReentrantLock的lock和lockInterruptibly方法的區(qū)別,以及AQS中的雙向鏈表設(shè)計,lock方法不響應(yīng)中斷,而lockInterruptibly方法會響應(yīng)中斷,AQS的雙向鏈表設(shè)計使得線程管理更加高效和靈活,適用于高并發(fā)場景2025-02-02
SpringBoot整合SSO(single sign on)單點(diǎn)登錄
這篇文章主要介紹了SpringBoot整合SSO(single sign on)單點(diǎn)登錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Springboot+Poi導(dǎo)入Excel表格實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Springboot+Poi導(dǎo)入Excel表格實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
高分面試分析jvm如何實(shí)現(xiàn)多態(tài)
這篇文章主要介紹了講解了在面試中jvm如何實(shí)現(xiàn)多態(tài),怎樣回答才能得到高分的問題分析,有需要的朋友可以借鑒參考下,祝大家早日升職加薪多多進(jìn)步2022-01-01
Java后端向前端返回文件流實(shí)現(xiàn)下載功能的方法
這篇文章主要給大家介紹了關(guān)于Java后端向前端返回文件流實(shí)現(xiàn)下載功能的相關(guān)資料,Java后端可以通過調(diào)用接口返回文件流來實(shí)現(xiàn)文件傳輸功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

