您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“RestTemplate自定義請求失敗異常處理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“RestTemplate自定義請求失敗異常處理”吧!
在使用RestTemplate進(jìn)行遠(yuǎn)程接口服務(wù)調(diào)用的時候,當(dāng)請求的服務(wù)出現(xiàn)異常:超時、服務(wù)不存在等情況的時候(響應(yīng)狀態(tài)非200、而是400、500HTTP狀態(tài)碼),就會拋出如下異常:
該異常我是模擬出來的,將正確的請求服務(wù)地址由“/posts/1”改成“/postss/1”。服務(wù)不存在所以拋出404異常。
[@Test](https://my.oschina.net/azibug) public void testEntity() { String url = "http://jsonplaceholder.typicode.com/postss/1"; ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class); //這行拋出異常 //下面兩行代碼執(zhí)行不到 HttpStatus statusCode = responseEntity.getStatusCode(); // 獲取響應(yīng)碼 System.out.println("HTTP 響應(yīng)狀態(tài):" + statusCode); }
異常拋出之后,程序后面的代碼就執(zhí)行不到了,無法進(jìn)行后面的代碼執(zhí)行。實際的業(yè)務(wù)開發(fā)中,有的時候我們更期望的結(jié)果是:不管你服務(wù)端是超時了還是服務(wù)不存在,我們都應(yīng)該獲得最終的請求結(jié)果(HTTP請求結(jié)果狀態(tài)400、500),而不是獲得一個拋出的異常。
首先我要說一個結(jié)論:RestTemplate請求結(jié)果異常是可以自定義處理的。在開始進(jìn)行自定義的異常處理邏輯之前,我們有必要看一下異常處理的默認(rèn)實現(xiàn)。也就是:為什么會產(chǎn)生上面小節(jié)提到的現(xiàn)象?
ResponseErrorHandler是RestTemplate請求結(jié)果的異常處理器接口
接口的第一個方法hasError用于判斷HttpResponse是否是異常響應(yīng)(通過狀態(tài)碼)
接口的第二個方法handleError用于處理異常響應(yīng)結(jié)果(非200狀態(tài)碼段)
DefaultResponseErrorHandler是ResponseErrorHandler的默認(rèn)實現(xiàn)
所以我們就來看看DefaultResponseErrorHandler是如何來處理異常響應(yīng)的?從HttpResponse解析出Http StatusCode,如果狀態(tài)碼StatusCode為null,就拋出UnknownHttpStatusCodeException異常。
如果StatusCode存在,則解析出StatusCode的series,也就是狀態(tài)碼段(除了200段,其他全是異常狀態(tài)碼),解析規(guī)則是StatusCode/100取整。
public enum Series { INFORMATIONAL(1), // 1xx/100 SUCCESSFUL(2), // 2xx/100 REDIRECTION(3), // 3xx/100 CLIENT_ERROR(4), // 4xx/100 ,客戶端異常 SERVER_ERROR(5); // 5xx/100 ,服務(wù)端異常 }
進(jìn)一步針對客戶端異常和服務(wù)端異常進(jìn)行處理,處理的方法是拋出HttpClientErrorException。也就是第一小節(jié)出現(xiàn)的異常的原因
所以我們要實現(xiàn)自定義異常,實現(xiàn)ResponseErrorHandler 接口就可以。
public class MyRestErrorHandler implements ResponseErrorHandler { /** * 判斷返回結(jié)果response是否是異常結(jié)果 * 主要是去檢查response 的HTTP Status * 仿造DefaultResponseErrorHandler實現(xiàn)即可 */ [@Override](https://my.oschina.net/u/1162528) public boolean hasError(ClientHttpResponse response) throws IOException { int rawStatusCode = response.getRawStatusCode(); HttpStatus statusCode = HttpStatus.resolve(rawStatusCode); return (statusCode != null ? statusCode.isError(): hasError(rawStatusCode)); } protected boolean hasError(int unknownStatusCode) { HttpStatus.Series series = HttpStatus.Series.resolve(unknownStatusCode); return (series == HttpStatus.Series.CLIENT_ERROR || series == HttpStatus.Series.SERVER_ERROR); } [@Override](https://my.oschina.net/u/1162528) public void handleError(ClientHttpResponse response) throws IOException { // 里面可以實現(xiàn)你自己遇到了Error進(jìn)行合理的處理 //TODO 將接口請求的異常信息持久化 } }
將MyRestErrorHandler 在RestTemplate實例化的時候進(jìn)行注冊。
這時再去執(zhí)行第一小節(jié)中的示例代碼,就不會拋出異常。而是得到一個HTTP Status 404的結(jié)果。我們可以根據(jù)這個結(jié)果,在程序中繼續(xù)向下執(zhí)行代碼。
到此,相信大家對“RestTemplate自定義請求失敗異常處理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。