最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

RestTemplate實現多種底層HTTP客戶端類庫的切換用法

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

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

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

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

一、異?,F象

在使用RestTemplate進行遠程接口服務調用的時候,當請求的服務出現異常:超時、服務不存在等情況的時候(響應狀態(tài)非200、而是400、500HTTP狀態(tài)碼),就會拋出如下異常:

該異常我是模擬出來的,將正確的請求服務地址由“/posts/1”改成“/postss/1”。服務不存在所以拋出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(); // 獲取響應碼
   System.out.println("HTTP 響應狀態(tài):" + statusCode);
}

異常拋出之后,程序后面的代碼就執(zhí)行不到了,無法進行后面的代碼執(zhí)行。實際的業(yè)務開發(fā)中,有的時候我們更期望的結果是:不管你服務端是超時了還是服務不存在,我們都應該獲得最終的請求結果(HTTP請求結果狀態(tài)400、500),而不是獲得一個拋出的異常。

二、源碼解析-默認實現

首先我要說一個結論:RestTemplate請求結果異常是可以自定義處理的。在開始進行自定義的異常處理邏輯之前,我們有必要看一下異常處理的默認實現。也就是:為什么會產生上面小節(jié)提到的現象?

ResponseErrorHandler是RestTemplate請求結果的異常處理器接口

  • 接口的第一個方法hasError用于判斷HttpResponse是否是異常響應(通過狀態(tài)碼)
  • 接口的第二個方法handleError用于處理異常響應結果(非200狀態(tài)碼段)

DefaultResponseErrorHandler是ResponseErrorHandler的默認實現

所以我們就來看看DefaultResponseErrorHandler是如何來處理異常響應的?從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 ,服務端異常
}

進一步針對客戶端異常和服務端異常進行處理,處理的方法是拋出HttpClientErrorException。也就是第一小節(jié)出現的異常的原因

三、RestTemplate自定義異常處理

所以我們要實現自定義異常,實現ResponseErrorHandler 接口就可以。

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

將MyRestErrorHandler 在RestTemplate實例化的時候進行注冊。

參考:

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

RestTemplate實現多種底層HTTP客戶端類庫的切換用法

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

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

相關文章

  • java自動生成接口文檔完整代碼示例

    java自動生成接口文檔完整代碼示例

    在軟件開發(fā)中,編寫接口文檔是一項必要但繁瑣的任務,為了簡化這一過程,可以通過使用Swagger2和Swagger-UI來自動生成接口文檔,這篇文章主要介紹了java自動生成接口文檔的相關資料,需要的朋友可以參考下
    2021-07-07
  • springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決

    springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決

    這篇文章主要介紹了springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java開發(fā)SpringBoot參數校驗過程示例教程

    java開發(fā)SpringBoot參數校驗過程示例教程

    這篇文章主要為大家介紹了SpringBoot如何進行參數校驗的過程示例詳解教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • mybatis?resultMap沒有全部對應的字段處理方式

    mybatis?resultMap沒有全部對應的字段處理方式

    這篇文章主要介紹了mybatis?resultMap沒有全部對應的字段處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring?Boot?+?Spring?Batch?實現批處理任務的詳細教程

    Spring?Boot?+?Spring?Batch?實現批處理任務的詳細教程

    這篇文章主要介紹了Spring?Boot+Spring?Batch實現批處理任務,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java的HashSet源碼詳解

    Java的HashSet源碼詳解

    這篇文章主要介紹了Java的HashSet源碼詳解,HashSet底層封裝的是HashMap,所以元素添加會放到HashMap的key中,value值使用new Object對象作為value,所以HashSet和HashMap的所具有的特點是類似的,需要的朋友可以參考下
    2023-09-09
  • spring緩存自定義resolver的方法

    spring緩存自定義resolver的方法

    這篇文章主要為大家詳細介紹了spring緩存自定義resolver的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot+shardingsphere實現按月分表功能教程

    SpringBoot+shardingsphere實現按月分表功能教程

    這篇文章主要介紹了SpringBoot+shardingsphere實現按月分表功能教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 解決javac不是內部或外部命令,也不是可運行程序的報錯問題

    解決javac不是內部或外部命令,也不是可運行程序的報錯問題

    在學著使用Java的命令行來編譯java文件的時候,遇到了這個問題,本文主要介紹了解決javac不是內部或外部命令,也不是可運行程序的報錯問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java圖片與二進制相互轉換實現示例講解

    Java圖片與二進制相互轉換實現示例講解

    這篇文章主要介紹了Java圖片與二進制相互轉換實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-03-03

最新評論

扬州市| 出国| 江口县| 黄浦区| 九龙坡区| 手游| 廉江市| 牡丹江市| 游戏| 伊通| 将乐县| 富平县| 睢宁县| 罗平县| 淮阳县| 万山特区| 阆中市| 二手房| 郧西县| 筠连县| 沧州市| 梨树县| 沾化县| 措美县| 石屏县| 德保县| 崇礼县| 呼图壁县| 沁源县| 肇源县| 太和县| 滕州市| 枝江市| 正安县| 汤原县| 上林县| 象州县| 张家口市| 五大连池市| 略阳县| 澄城县|