Graceful Response 構(gòu)建 Spring Boot 響應(yīng)處理的方法
一、Graceful Response
Graceful Response 是一個 Spring Boot 技術(shù)棧下的優(yōu)雅響應(yīng)處理器,提供一站式統(tǒng)一返回值封裝、全局異常處理、自定義異常錯誤碼等功能,使用Graceful Response進(jìn)行web接口開發(fā)不僅可以節(jié)省大量的時間,還可以提高代碼質(zhì)量,使代碼邏輯更清晰。
github地址:https://github.com/feiniaojin/graceful-response
對應(yīng) 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 接口:

三、返回格式調(diào)整
Graceful Response 內(nèi)置了兩種風(fēng)格的返回,可以通過修改 graceful-response.response-style 進(jìn)行切換,分別是:
默認(rèn)格式:
graceful-response: response-style: 0
第二種模式:
{
"status": {
"code": 200,
"msg": "success"
},
"payload": {
}
}格式如下:
{
"code": "200",
"msg": "success",
"data": {
}
}如果需要自定義返回格式則需要實(shí)現(xiàn) Response 接口,并在配置中通過graceful-response.response-class-full-name 進(jìn)行指定,例如:
@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
再次訪問上面的測試接口:

四、自定義異常和錯誤碼
當(dāng)拋出異常時我們希望根據(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ù)校驗(yàn)異常錯誤碼
有的時候我們需要校驗(yàn)?zāi)硞€參數(shù)是否合法,當(dāng)在不同情況下需要返回不同的錯誤碼,在 Graceful Response 中對JSR-303數(shù)據(jù)校驗(yàn)規(guī)范和Hibernate Validator進(jìn)行了增強(qiáng),Graceful Response自身不提供參數(shù)校驗(yàn)的功能,但是用戶使用了Hibernate Validator后,Graceful Response可以通過@ValidationStatusCode注解為參數(shù)校驗(yàn)結(jié)果提供響應(yīng)碼,并將其統(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時,只需要調(diào)用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ù)包名進(jìn)行排除,例如:
graceful-response:
exclude-packages:
- springfox.**graceful-response:
exclude-packages:
- org.springframework.boot.actuate.*八、常用配置
graceful-response:
# 自定義Response類的全限定名,默認(rèn)為空。
# 配置response-class-full-name后,response-style將不再生效
response-class-full-name:
# 是否打印異常日志,默認(rèn)為false
print-exception-in-global-advice: false
# Response風(fēng)格,不配置默認(rèn)為0
response-style: 0
# 自定義的成功響應(yīng)碼,不配置則為0
default-success-code: 0
# 自定義的成功提示,默認(rèn)為ok
default-success-msg: ok
# 自定義的失敗響應(yīng)碼,默認(rèn)為1
default-error-code: 1
# 自定義的失敗提示,默認(rèn)為error
default-error-msg: error
# 全局的參數(shù)校驗(yàn)錯誤碼,默認(rèn)等于default-error-code
default-validate-error-code:
# 例外包路徑(支持?jǐn)?shù)字, *和**通配符匹配),該包路徑下的controller將被忽略處理
exclude-packages:
- com.lizhiadmin.pro.module.*.controller
# 設(shè)置是否將原生異常錯誤信息detailMessage字段填充到Response的msg中
# 默認(rèn)為false,即不打開
origin-exception-using-detail-message: false到此這篇關(guān)于Graceful Response 構(gòu)建 Spring Boot 下優(yōu)雅的響應(yīng)處理的文章就介紹到這了,更多相關(guān)Spring Boot 響應(yīng)處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例
這篇文章主要介紹了Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
Windows安裝Maven并配置環(huán)境的詳細(xì)步驟
Maven是一個非常流行的構(gòu)建和項(xiàng)目管理工具,用于Java開發(fā),它提供了一個強(qiáng)大的依賴管理系統(tǒng)和一系列標(biāo)準(zhǔn)化的構(gòu)建生命周期,本文將指導(dǎo)您如何在Windows操作系統(tǒng)上安裝和配置Maven,需要的朋友可以參考下2023-05-05
Java線程池雙雄之ForkJoinPool和ThreadPoolExecutor的區(qū)別詳解
Java線程池是多線程編程中的一個重要概念,主要用于管理和復(fù)用線程資源,避免頻繁創(chuàng)建和銷毀線程帶來的性能開銷,這篇文章主要介紹了Java線程池雙雄之ForkJoinPool和ThreadPoolExecutor區(qū)別的相關(guān)資料,需要的朋友可以參考下2026-04-04
基于Java文件輸入輸出流實(shí)現(xiàn)文件上傳下載功能
這篇文章主要為大家詳細(xì)介紹了基于Java文件輸入輸出流實(shí)現(xiàn)文件上傳下載功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
基于SpringBoot框架實(shí)現(xiàn)文件上傳下載分享功能
在當(dāng)今的Web應(yīng)用開發(fā)中,文件上傳與下載功能是極為常見且重要的需求,無論是用戶上傳頭像、分享文檔,還是系統(tǒng)生成報告供用戶下載,都離不開這一功能模塊,SpringBoot作為一款流行的Java開發(fā)框架,為我們提供了簡潔高效的方式來實(shí)現(xiàn)文件上傳與下載,需要的朋友可以參考下2025-06-06
Mybatis-Plus中updateById方法不能更新空值問題解決
本文主要介紹了Mybatis-Plus中updateById方法不能更新空值問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
深入淺出Java中的Happens-Before核心規(guī)則
本文解析Java內(nèi)存模型中的Happens-Before原則,解釋其定義、核心規(guī)則及實(shí)際應(yīng)用,幫助理解多線程可見性與有序性問題,掌握并發(fā)編程關(guān)鍵,感興趣的朋友跟隨小編一起看看吧2025-09-09
JAVA刪除字符串固定下標(biāo)字串的實(shí)現(xiàn)
本文主要介紹了JAVA刪除字符串固定下標(biāo)字串的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

