Graceful Response 構建 Spring Boot 響應處理的方法
一、Graceful Response
Graceful Response
是一個 Spring Boot
技術棧下的優(yōu)雅響應處理器,提供一站式統(tǒng)一返回值封裝、全局異常處理、自定義異常錯誤碼等功能,使用Graceful Response
進行web
接口開發(fā)不僅可以節(jié)省大量的時間,還可以提高代碼質量,使代碼邏輯更清晰。
github地址:https://github.com/feiniaojin/graceful-response
對應 SpringBoot 版本
Spring Boot版本 | Graceful Response版本 | graceful-response-example分支 |
---|---|---|
2.x | 3.4.0-boot2 | 3.4.0-boot2 |
3.x | 3.4.0-boot3 | 3.4.0-boot3 |
二、快速使用
引入依賴:
<dependency> <groupId>com.feiniaojin</groupId> <artifactId>graceful-response</artifactId> <version>3.4.0-boot2</version> </dependency>
啟動類增加注解:
@EnableGracefulResponse
聲明測試接口:
@Slf4j @RestController @RequestMapping("/test") public class TestController { /** * 返回對象形式 */ @GetMapping("/t1") public Map<String, String> t1() { //具體邏輯 return Collections.singletonMap("status","abc"); } /** * Command 形式 */ @GetMapping("/t2") public void t2() { // 具體邏輯 } }
測試 /test/t1
接口:
測試 /test/t2
接口:
三、返回格式調整
Graceful Response
內置了兩種風格的返回,可以通過修改 graceful-response.response-style
進行切換,分別是:
默認格式:
graceful-response: response-style: 0
第二種模式:
{ "status": { "code": 200, "msg": "success" }, "payload": { } }
格式如下:
{ "code": "200", "msg": "success", "data": { } }
如果需要自定義返回格式則需要實現(xiàn) Response
接口,并在配置中通過graceful-response.response-class-full-name
進行指定,例如:
@Data public class CustomResponse implements Response { private String code; private Long timestamp = System.currentTimeMillis(); private String message; private Object data = Collections.EMPTY_MAP; @Override public void setStatus(ResponseStatus statusLine) { this.code = statusLine.getCode(); this.message = statusLine.getMsg(); } @Override @JsonIgnore public ResponseStatus getStatus() { return null; } @Override public void setPayload(Object payload) { this.data = payload; } @Override @JsonIgnore public Object getPayload() { return null; } }
然后在配置文件中聲明:
graceful-response: response-class-full-name: com.bxc.retrydemo.handler.CustomResponse
再次訪問上面的測試接口:
四、自定義異常和錯誤碼
當拋出異常時我們希望根據(jù)不同的異常返回不同的錯誤碼,在 Graceful Response
中為我們提供了 @ExceptionMapper
注解,可以快速的指定返回的錯誤碼和提示。
例如:
@ExceptionMapper(code = "1003", msg = "自定義異常", msgReplaceable = true) public class MyException extends RuntimeException { public MyException() { super(); } public MyException(String message) { super(message); } public MyException(String message, Throwable cause) { super(message, cause); } public MyException(Throwable cause) { super(cause); } public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }
測試接口修改:
@Slf4j @RestController @RequestMapping("/test") public class TestController { /** * 返回對象形式 */ @GetMapping("/t1") public Map<String, String> t1(Integer a) { //具體邏輯 // .... // 拋出異常 if (a == 0){ throw new MyException(); } return Collections.singletonMap("status","abc"); } /** * Command 形式 */ @GetMapping("/t2") public void t2(Integer a) { //具體邏輯 // .... // 拋出異常 if (a == 0){ throw new MyException("t2 接口執(zhí)行異常"); } } }
測試 /test/t1
接口:
測試 /test/t2
接口:
五、參數(shù)校驗異常錯誤碼
有的時候我們需要校驗某個參數(shù)是否合法,當在不同情況下需要返回不同的錯誤碼,在 Graceful Response
中對JSR-303
數(shù)據(jù)校驗規(guī)范和Hibernate Validator
進行了增強,Graceful Response
自身不提供參數(shù)校驗的功能,但是用戶使用了Hibernate Validator
后,Graceful Response
可以通過@ValidationStatusCode
注解為參數(shù)校驗結果提供響應碼,并將其統(tǒng)一封裝返回。
例如:
@Data public class TestDTO { @NotNull(message = "name 不可為空") @Length(min = 1, max = 5, message = "name 的長度在 1-5 之間") @ValidationStatusCode(code = "1003") private String name; @NotNull(message = "age 不可為空") @Min(value = 0,message = "age 不可小于 0 ") @ValidationStatusCode(code = "1004") private Integer age; }
聲明測試接口:
@Slf4j @RestController @RequestMapping("/test") public class TestController { @PostMapping("/t3") public void t3(@Validated TestDTO dto) { //具體邏輯 // .... } }
測試 /test/t3
接口:
六、手動拋出指定狀態(tài)碼和信息
Graceful Response
提供了 GracefulResponse
通用工具類,在需要拋出GracefulResponseException
時,只需要調用raiseException
方法即可。
例如:
@Slf4j @RestController @RequestMapping("/test") public class TestController { /** * 返回對象形式 */ @GetMapping("/t1") public Map<String, String> t1(Integer a) { //具體邏輯 // .... // 拋出異常 if (a == 0) { GracefulResponse.raiseException("1065", "自定義拋出異常"); } return Collections.singletonMap("status", "abc"); } }
測試 /test/t1
接口:
七、例外請求放行
Graceful Response
會對所有的 controller
方法處理,如果希望跳過自定處理返回可以可以添加 @ExcludeFromGracefulResponse
注解:
例如:
@Slf4j @RestController @RequestMapping("/test") public class TestController { /** * 返回對象形式 */ @GetMapping("/t1") @ExcludeFromGracefulResponse public Map<String, String> t1(Integer a) { //具體邏輯 // .... return Collections.singletonMap("status", "abc"); } }
也可以根據(jù)包名進行排除,例如:
graceful-response: exclude-packages: - springfox.**
graceful-response: exclude-packages: - org.springframework.boot.actuate.*
八、常用配置
graceful-response: # 自定義Response類的全限定名,默認為空。 # 配置response-class-full-name后,response-style將不再生效 response-class-full-name: # 是否打印異常日志,默認為false print-exception-in-global-advice: false # Response風格,不配置默認為0 response-style: 0 # 自定義的成功響應碼,不配置則為0 default-success-code: 0 # 自定義的成功提示,默認為ok default-success-msg: ok # 自定義的失敗響應碼,默認為1 default-error-code: 1 # 自定義的失敗提示,默認為error default-error-msg: error # 全局的參數(shù)校驗錯誤碼,默認等于default-error-code default-validate-error-code: # 例外包路徑(支持數(shù)字, *和**通配符匹配),該包路徑下的controller將被忽略處理 exclude-packages: - com.lizhiadmin.pro.module.*.controller # 設置是否將原生異常錯誤信息detailMessage字段填充到Response的msg中 # 默認為false,即不打開 origin-exception-using-detail-message: false
到此這篇關于Graceful Response 構建 Spring Boot 下優(yōu)雅的響應處理的文章就介紹到這了,更多相關Spring Boot 響應處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?cloud?Hystrix注解初始化源碼過程解讀
這篇文章主要為大家介紹了Hystrix初始化部分,我們從源碼的角度分析一下@EnableCircuitBreaker以及@HystrixCommand注解的初始化過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-12-12Spring Data + Thymeleaf 3 + Bo
本篇文章主要介紹了Spring Data + Thymeleaf 3 + Bootstrap 4 實現(xiàn)分頁器實例代碼,非常具有實用價值,需要的朋友可以參考下2017-05-05關于通過java調用datax,返回任務執(zhí)行的方法
今天小編就為大家分享一篇關于通過java調用datax,返回任務執(zhí)行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Spring Boot 添加MySQL數(shù)據(jù)庫及JPA實例
本篇文章主要介紹了Spring Boot 添加MySQL數(shù)據(jù)庫及JPA,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03centos7如何通過systemctl啟動springboot服務代替java -jar方式啟動
這篇文章主要介紹了centos7如何通過systemctl啟動springboot服務代替java -jar方式啟動,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01SpringCloud-Hystrix實現(xiàn)原理總結
通過hystrix可以解決雪崩效應問題,它提供了資源隔離、降級機制、融斷、緩存等功能。接下來通過本文給大家分享SpringCloud-Hystrix實現(xiàn)原理,感興趣的朋友一起看看吧2021-05-05