JAVA 開發 SpringBoot RestTemplate自定義請求失敗異常處理

2020-12-17 計算機java編程

一、異常現象

在 JAVA 開發中我們經常會使用RestTemplate進行遠程接口調用,如果請求的接口出現異常:超時、服務不存在等等情況,這時響應狀態不是200,而是400、500等等狀態碼,這種情況下,程序便會拋出異常,如下:

404異常

上面出現的異常我是模擬出來的,由「/postss/1」替換了正確的地址由「/posts/1」。這時請求該服務不存在,肯定會拋出404異常。代碼如下:

這裡拋出了404 Not Found 的異常,後面的業務邏輯肯定是無法執行的了。

我們在實際的開發中,不管服務端因為什麼問題導致異常,都應該獲得最終的請求結果(HTTP請求結果狀態400、500),而不是獲得一個拋出的異常。

二、源碼解析-默認實現

首先程序中99%的異常都是可以自定義處理的,RestTemplate請求結果的異常自然也是可以自定義處理的。在開始自定義之前,我們來探究一下異常的默認處理實現,以此來說明為什麼會出現這樣的現象?

RestTemplate請求結果的異常處理器接口是ResponseErrorHandler,下面介紹一下該接口的兩個重要方法:hasError():用於判斷HttpResponse是否是異常響應(通過狀態碼)handleError():用於處理異常響應結果(非200狀態碼段)DefaultResponseErrorHandler是ResponseErrorHandler的默認實現下面是ResponseErrorHandler接口的源碼實現:

上面提到ResponseErrorHandler的默認實現是DefaultResponseErrorHandler,既然如此我們跟蹤一下該實現看看是如何來處理異常響應的?從HttpResponse解析出Http StatusCode,如果狀態碼StatusCode為null,就拋出UnknownHttpStatusCodeException異常。

如果StatusCode存在,就會調用DefaultResponseErrorHandler#handleError(ClientHttpResponse, HttpStatus)接口來解析出StatusCode的series,也就是狀態碼段(除了200段,其他全是異常狀態碼),解析規則是StatusCode/100取整。

進一步針對客戶端異常和服務端異常進行處理,處理的方法是拋出HttpClientErrorException。

三、RestTemplate自定義異常處理

通過上面的介紹可知:要實現RestTemplate自定義異常處理,只需要實現ResponseErrorHandler 接口就可以。方法如下:

將MyRestErrorHandler 在RestTemplate實例化的時候進行註冊,這樣請求的異常處理便會走自定義的異常處理類進行處理了。實現方式如下:

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

到此已經介紹完RestTemplate請求異常處理邏輯,歡迎大家在評論區踴躍發言,各抒自見,共同交流學習,也歡迎大家對本文中錯誤或者不足之處提出您的寶貴意見!

相關焦點

  • 優雅的http請求方式RestTemplate,讓人愛不釋手
    作為一名java服務端開發者,我們一般是提供接口給前端調用,但要是遇到我們也需求請求第三方接口,類似前端那樣調用第三方接口,該怎麼辦?在使用spring boot時,Apache中HttpClient支持,個人感覺代碼比較複雜,使用RestTemplate來發起http請求,代碼更加簡潔了。
  • pacebox-springboot 1.1.5 發布,java 生態框架
    pacebox-springboot 融合封裝已發布,旨在提供快速開發腳手架、打造更好的開源生態環境。
  • springboot的jar為何能獨立運行
    能獨立運行的jar文件在開發springboot應用時,通過java -jar命令啟動應用是常用的方式,今天就來一起了解這個簡單操作背後的技術;開發demo開發一個springboot應用作為本次研究的對象,對應的版本信息如下:
  • springboot+springsecurity實現前後端分離簡單實現!
    簡單理解: 自定義配置登錄成功、登陸失敗、註銷成功目標結果類,並將其注入到springsecurity的配置文件中。自定義返回結果集,這個看個人的,怎麼開心怎麼來!自定義登錄失敗時的處理邏輯//登錄失敗返回給前端消息@Componentpublic class AuthenticationFailure implements AuthenticationFailureHandler{@Autowired Gson
  • Springcloud序之Springboot2x模塊化+rest assured+AES加解密實現
    2、加解密模塊2.1、模塊結構加解密模塊主要有兩個包,aesutil和exception包,其中aesutil才是我們這個模塊的主角,exception包只是一個自定義的異常類而已,因這兩個類在網上很容易就能搜到或自己實現,這裡對AESUtil和CommonException不再進行展示,只要記住我們會用AESUtil中encrypt方法進行加密,使用decrypt
  • 如何優雅的設計 Java 異常
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫導語異常處理是程序開發中必不可少操作之一,但如何正確優雅的對異常進行處理確是一門學問
  • Springboot+MybatisPlus高效實現增刪改查
    PackageConfig pc = new PackageConfig();pc.setModuleName("user");pc.setParent("com.huangtl");mpg.setPackageInfo(pc);// 自定義配置
  • Spring Boot優雅地處理404異常
    整個過程並沒有發生任何異常,所以不能觸發Spring的全局異常處理機制。到這邊還有一個問題沒有解決:就是下面的404提示信息是怎麼返回的。自定義404錯誤處理類我們先看下BasicErrorController是在哪裡進行配置的。在IDEA中,查看BasicErrorController的usage,我們發現這個類是在ErrorMvcAutoConfiguration中自動配置的。
  • 你必須掌握的 21 個 Java 核心技術!
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫51閒來無事,師長一向不(沒)喜(有)歡(錢)湊熱鬧,倒不如趁著這時候覆盤復盤。
  • 記錄springboot接收post和get兩種方式提交數據的不同方法
    剛開始接觸前端開發框架uni-app想通過寫個簡單的前端登錄請求到後端服務,不曾想遇到了很多問題。問題一:服務端接收不到請求。問題二:服務端接收不到請求發送過來的參數信息。本文著重描述下服務端接收不到請求參數的情況,對服務端接收不到請的問題,暫不詳細講解。如有讀者需要請留言,視大家的對問題的關注度定是否在近期做記錄。問題一的主要原因是因做的是前後端分離的移動項目,手機端請求伺服器時存在跨域問題。需要在伺服器端做跨域方面的處理。後端伺服器才可以接收到移動端發送的請求。
  • SpringBoot實現QQ郵箱註冊和登錄
    3.1、UserController.java 3.2、UserMapper.java 3.3、User.java 3.4、MailService.java ,重要。
  • 可視化Java快速開發平臺,強大工作流引擎
    這款java快速開發平臺是一款支持JAVA/.NETCORE兩種類型,多種類型資料庫,是一套可視化的軟體快速開發工具。相比傳統代碼開發,能快速提高開發效率,幫助公司節省人力成本,擴展性也非常好。XJR快速開發平臺可以根據業務需求定製化開發出適用於自己企業的管理系統。快速平臺開發不要求會美工,會編程,小白也能快速開發出自己想用的業務功能。
  • SpringBoot 增強庫 yue-library 2.1.0 發布,提供更多特性支持
    本次更新分離了響應式編程與阻塞式編程,對Auth認證模塊也做了相應的拆分與優化,同時從此版本開始對開發文檔進行了進一步支持,區分各大本版文檔說明,增加歷史文檔專區。2.1.2.RELEASE spring-cloud Greenwich.SR5 點擊查看更多依賴版本定義 【base】提供yml默認配置支持,一鍵解決常規坑點困擾(如:時間格式化、可執行SQL列印、接口定義列印等
  • 黑馬程式設計師:SpringBoot教程,SpringBoot高級之原理分析
    將類的判斷定義為動態的。判斷哪個字節碼文件存在可以動態指定。自定義條件:自定義條件類:自定義類實現Condition接口,重寫 matches 方法,在 matches 方法中進行邏輯判斷,返回boolean值 。
  • 程式設計師:一步一步輕鬆實現SpringBoot整合Redis緩存,看了不後悔
    前言隨著技術的發展,程序框架也越來越多,非常考驗程序的學習能力,但是框架的產生在程式設計師開發過程中也提供很多便利,框架可以為程式設計師減少許多工作量,比如spring boot 、mybatis等都可以提高開發人員的工作效率,今天就來聊聊spring boot與redis 的整合。
  • 全網最細緻的SpringBoot實戰教程,超適合新手小白入坑學習
    >1.背景問題J2EE笨重的開發,繁多的配置、低下的開發效率、複雜的部署流程,第三發技術集成難度大。2.IDEA的默認修改:修改IDEA的默認maven ,具體看下面的博客https://blog.csdn.net/weixin_43034040/article/details/103835125HelloWorld項目瀏覽器發送hello請求
  • 乾貨|SpringBoot註解大全,值得收藏
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫一、註解(annotations)列表@SpringBootApplication
  • Springboot 項目搭建入門
    項目由於其自動配置了很多的依賴,簡化了開發者的配置,因此加快了開發者的開發速度,但是如果對spring 底層等不太了解的人,還是有些懵的,建議大家學習spring 之後再來使用spring boot項目來搭建。
  • 企業開發java主流框架技術選型整理
    想用Activiti來做企業應用,其實還需要做大量的開發封裝。Sharkosworkflow如果java底子不好的話,可以試試國內最新自主研發的XJR快速開發平臺工作流。XJR基於B/S結構,採用主流的Activity工作流引擎,遵循bpmn規範,可實現XML、Json一鍵導入導出,以及添加了人員動態選擇、便捷式會籤設置、便捷式任務委託設置、添加自定義表單、自定義節點按鈕、動態變量選擇(包括會籤變量、按鈕變量、表單變量)以及各節點屬性優化,遵循以使用者為中心的優化原則,通過可視化配置界面,只需要拖拽組件,拼接流程,可視化操作,