Spring Cloud Gateway過濾器精確控制異常返回(實戰,控制http返回碼和message字段)


歡迎訪問我的GitHub

這里分類和匯總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

本篇概覽

在這里插入圖片描述

  • 為了簡單起見,本篇不再新增maven子工程,而是基於前文創建的子工程gateway-change-body,在這里面繼續寫代碼;

源碼下載

名稱 鏈接 備注
項目主頁 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內容,篇幅所限,這種終極的解決方式就留在下一篇吧,敬請期待,欣宸原創,必不辜負您...

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數據庫+中間件系列
  6. DevOps系列

歡迎關注公眾號:程序員欣宸

微信搜索「程序員欣宸」,我是欣宸,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM