歡迎訪問我的GitHub
這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
本篇概覽
- 前文《Spring Cloud Gateway過濾器精確控制異常返回(分析篇)》我們們閱讀原始碼,瞭解到Spring Cloud Gateway是如何處理全域性異常資訊的,學了那麼多理論,不免手癢想實戰驗證學習效果,今天我們們就來寫程式碼,最終目標是改寫下圖兩個紅框中的內容:
- 為了簡單起見,本篇不再新增maven子工程,而是基於前文建立的子工程gateway-change-body,在這裡面繼續寫程式碼;
原始碼下載
- 本篇實戰中的完整原始碼可在GitHub下載到,地址和連結資訊如下表所示(https://github.com/zq2599/blog_demos):
名稱 | 連結 | 備註 |
---|---|---|
專案主頁 | https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
- 這個git專案中有多個資料夾,本篇的原始碼在spring-cloud-tutorials資料夾下,如下圖紅框所示:
- spring-cloud-tutorials資料夾下有多個子工程,本篇的程式碼是gateway-change-body,如下圖紅框所示:
第一種:丟擲ResponseStatusException異常
- 開啟gateway-change-body工程的RequestBodyRewrite.java檔案,改動如下圖紅框,如果請求body不含user-id引數就返回Mono.error,入參是ResponseStatusException異常,設定了返回碼為400,message為一段中文描述:
-
接下來執行nacos、provider-hello工程、gateway-change-body工程
-
用postman發請求試試,請求和響應的詳情如下圖:
- 從上圖可見,返回碼為400,和我們設定的一樣,但是message卻為空,這是怎麼回事呢?按照我們們的設定,這裡應該顯示請求引數必須包含user-id欄位,看來我們們遇到一隻攔路虎了
小小攔路虎
- 我們們程式碼中,拋異常的時候設定message內容如下圖紅框所示,但執行的時候返回的是空字串,這是怎麼回事呢?
- 來看DefaultErrorWebExceptionHandler.isIncludeMessage方法,看下圖紅框中的那個errorProperties,您會不會恍然大悟:這不就是springboot配置中的erro配置嘛!
- 修改工程的配置檔案,紅框內是新增的配置:
- 再用postman試試,如下圖,這一次,status、message、exception、trace齊聚一堂,完全符合預期:
- 看來第一種方法是可行的:返回ResponseStatusException型別的異常;
第二種:自定義異常,帶ResponseStatus註解
-
接下來試試第二種方法:通ResponseStatus註解
-
首先新建一個異常類MyGatewayException.java,使用了ResponseStatus,在裡面配置返回碼和message內容,這次的返回碼用的是403:
package com.bolingcavalry.changebody.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "user-id欄位不能為空")
public class MyGatewayException extends Exception {
}
- 編碼完成,重啟應用,然後再發一次請求,如下圖,返回碼和message內容都符合預期:
- 至此,兩種最簡單的方式都完成驗證,一般情況下已經滿足要求:將錯誤資訊準確傳遞給呼叫方
留有瑕疵
-
聰明的您應該已發現上述兩種方案有瑕疵:返回body的格式和欄位都是固定的,如果專案中對返回body的內容有嚴格要求,例如只允許code、message、data三個欄位,其餘欄位一律不能返回,此時又該怎麼辦呢?
-
似乎需要一種方法,讓我們們可以隨心所欲的設定body內容,篇幅所限,這種終極的解決方式就留在下一篇吧,敬請期待,欣宸原創,必不辜負您...
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos