欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RestTemplate自定義請求失敗異常處理示例解析

 更新時間:2022年03月17日 10:46:05   作者:字母哥哥  
這篇文章主要為大家介紹了RestTemplate自定義請求失敗異常處理的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

前言

本文是精講RestTemplate第7篇,前篇的blog訪問地址如下:

RestTemplate在Spring或非Spring環(huán)境下使用精講

RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫的切換用法

RestTemplate發(fā)送HTTP GET請求使用方法詳解

RestTemplate發(fā)送HTTP POST請求使用方法詳解

RestTemplate的DELETE及PUT等請求方法使用精講

RestTemplate文件上傳下載與大文件流式下載

一、異?,F(xiàn)象

在使用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
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í)行。實(shí)際的業(yè)務(wù)開發(fā)中,有的時候我們更期望的結(jié)果是:不管你服務(wù)端是超時了還是服務(wù)不存在,我們都應(yīng)該獲得最終的請求結(jié)果(HTTP請求結(jié)果狀態(tài)400、500),而不是獲得一個拋出的異常。

二、源碼解析-默認(rèn)實(shí)現(xiàn)

首先我要說一個結(jié)論:RestTemplate請求結(jié)果異常是可以自定義處理的。在開始進(jìn)行自定義的異常處理邏輯之前,我們有必要看一下異常處理的默認(rèn)實(shí)現(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)實(shí)現(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)的異常的原因

三、RestTemplate自定義異常處理

所以我們要實(shí)現(xiàn)自定義異常,實(shí)現(xiàn)ResponseErrorHandler 接口就可以。

public class MyRestErrorHandler implements ResponseErrorHandler {
    /**
     * 判斷返回結(jié)果response是否是異常結(jié)果
     * 主要是去檢查response 的HTTP Status
     * 仿造DefaultResponseErrorHandler實(shí)現(xiàn)即可
     */
    @Override
    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
    public void handleError(ClientHttpResponse response) throws IOException {
        // 里面可以實(shí)現(xiàn)你自己遇到了Error進(jìn)行合理的處理
        //TODO 將接口請求的異常信息持久化
    }
}

將MyRestErrorHandler 在RestTemplate實(shí)例化的時候進(jìn)行注冊。

參考:

RestTemplate在Spring或非Spring環(huán)境下使用精講

RestTemplate實(shí)現(xiàn)多種底層HTTP客戶端類庫的切換用法

這時再去執(zhí)行第一小節(jié)中的示例代碼,就不會拋出異常。而是得到一個HTTP Status 404的結(jié)果。我們可以根據(jù)這個結(jié)果,在程序中繼續(xù)向下執(zhí)行代碼。

以上就是RestTemplate自定義請求失敗異常處理示例解析的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate自定義請求失敗異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java內(nèi)存模型原子性原理及實(shí)例解析

    Java內(nèi)存模型原子性原理及實(shí)例解析

    這篇文章主要介紹了Java內(nèi)存模型原子性原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Java對象轉(zhuǎn)JSON時動態(tài)的增刪改查屬性詳解

    Java對象轉(zhuǎn)JSON時動態(tài)的增刪改查屬性詳解

    這篇文章主要介紹了Java對象轉(zhuǎn)JSON時如何動態(tài)的增刪改查屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java中的對象、類、抽象類、接口、繼承之間的聯(lián)系

    Java中的對象、類、抽象類、接口、繼承之間的聯(lián)系

    這篇文章主要介紹了Java中的對象、類、抽象類、接口、繼承之間的聯(lián)系,文章講解的很清晰,有不太懂的同學(xué)可以多研究下
    2021-02-02
  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java操作(DOM、SAX、JDOM、DOM4J)xml方式的四種比較與詳解

    java中四種操作(DOM、SAX、JDOM、DOM4J)xml方式的比較與詳解
    2008-10-10
  • Java阻塞隊(duì)列四組API介紹(小結(jié))

    Java阻塞隊(duì)列四組API介紹(小結(jié))

    這篇文章主要介紹了Java阻塞隊(duì)列四組API介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Mac電腦安裝多個JDK版本的詳細(xì)圖文教程

    Mac電腦安裝多個JDK版本的詳細(xì)圖文教程

    目前使用的主流版本還是JDK 8,但偶爾會想體驗(yàn)下新版本(或者舊版本),如果能裝多個版本的JDK,而且很方便的切換就好了,這篇文章主要給大家介紹了關(guān)于Mac電腦安裝多個JDK版本的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    HashMap和HashSet都是存儲在哈希桶之中,通過本文我們可以先了解一些哈希桶是什么,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • 利用java實(shí)現(xiàn)中獎概率詳情

    利用java實(shí)現(xiàn)中獎概率詳情

    這篇文章主要介紹了利用java實(shí)現(xiàn)中獎概率詳情,根據(jù)概率將獎品劃分區(qū)間,每個區(qū)間代表一個獎品,然后抽取???隨機(jī)數(shù)??,反查落在那個區(qū)間上,即為所抽取的獎品,需要的朋友可以參考一下
    2022-07-07
  • IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn)

    IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA優(yōu)化配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 通過實(shí)例解析Java類初始化和實(shí)例初始化

    通過實(shí)例解析Java類初始化和實(shí)例初始化

    這篇文章主要介紹了通過實(shí)例解析Java類初始化和實(shí)例初始化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論