精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

拒絕寫重復代碼,試試這套開源的 SpringBoot 組件,效率翻倍~

開發 前端
Graceful Response是一個Spring Boot技術棧下的優雅響應處理器,提供一站式統一返回值封裝、全局異常處理、自定義異常錯誤碼等功能,使用Graceful Response進行web接口開發不僅可以節省大量的時間,還可以提高代碼質量,使代碼邏輯更清晰。

1.簡介

Graceful Response是一個Spring Boot技術棧下的優雅響應處理器,提供一站式統一返回值封裝、全局異常處理、自定義異常錯誤碼等功能,使用Graceful Response進行web接口開發不僅可以節省大量的時間,還可以提高代碼質量,使代碼邏輯更清晰。

強烈推薦你花3分鐘學會它!

本項目案例工程代碼:https://github.com/feiniaojin/graceful-response-example.git ,注意選擇最新版本的分支。

Spring Boot版本

Graceful Response版本

graceful-response-example分支

2.x

3.2.1-boot2

3.2.0-boot2

3.x

3.2.1-boot3

3.2.0-boot3

注意,3.2.1-boot2版本的Graceful Response源碼由單獨的倉庫進行維護,地址為:https://github.com/feiniaojin/graceful-response-boot2

3.2.1-boot2和3.2.1-boot3除了支持的SpringBoot版本不一樣,其他實現完全一致,Maven引用時只需要根據對應的SpringBoot版本選擇Graceful Response的version即可,兩者的groupId、artifactId是一致的。

2.快速入門

2.1 Spring Boot接口開發現狀

目前,業界使用Spring Boot進行接口開發時,往往存在效率底下、重復勞動、可讀性差等問題。以下偽代碼相信大家非常熟悉,我們大部分項目的Controller接口都是這樣的。

@Controller
publicclass Controller {

    @GetMapping("/query")
    @ResponseBody
    public Response query(Map<String, Object> paramMap) {
        Response res = new Response();
        try {
            //1.校驗params參數合法性,包括非空校驗、長度校驗等
            if (illegal(paramMap)) {
                res.setCode(1);
                res.setMsg("error");
                return res;
            }
            //2.調用Service的一系列操作,得到查詢結果
            Object data = service.query(params);
            //3.將操作結果設置到res對象中
            res.setData(data);
            res.setCode(0);
            res.setMsg("ok");
            return res;
        } catch (Exception e) {
            //4.異常處理:一堆丑陋的try...catch,如果有錯誤碼的,還需要手工填充錯誤碼
            res.setCode(1);
            res.setMsg("error");
            return res;
        }
    }
}

這段偽代碼存在什么樣的問題呢?

第一個問題,效率低下。 Controller層的代碼應該盡量簡潔,上面的偽代碼其實只是為了將數據查詢的結果進行封裝,使其以統一的格式進行返回。例如以下格式的響應體:

{
  "code": 0,
  "msg": "ok",
  "data": {
    "id": 1,
    "name": "username"
  }
}

查詢過程中如果發生異常,需要在Controller進行手工捕獲,根據捕獲的異常人工地設置錯誤碼,當然,也用同樣的格式封裝錯誤碼進行返回。

可以看到,除了調用service層的query方法這一行,其他大部分的代碼都執行進行結果的封裝,大量的冗余、低價值的代碼導致我們的開發活動效率很低。

第二個問題,重復勞動。 以上捕獲異常、封裝執行結果的操作,每個接口都會進行一次,因此造成大量重復勞動。

第三個問題,可讀性低。 上面的核心代碼被淹沒在許多冗余代碼中,很難閱讀,如同大海撈針。

我們可以通過Graceful Response這個組件解決這樣的問題。

2.2. 快速入門

2.2.1 引入Graceful Response組件

Graceful Response已發布至maven中央倉庫,我們可以直接引入到項目中。

maven依賴如下:

<dependency>
    <groupId>com.feiniaojin</groupId>
    <artifactId>graceful-response</artifactId>
    <version>{latest.version}</version>
</dependency>

Spring Boot版本

Graceful Response最新版本

2.x

3.2.1-boot2

3.x

3.2.1-boot3

2.2.2 啟用Graceful Response

在啟動類中引入@EnableGracefulResponse注解,即可啟用Graceful Response組件。

@EnableGracefulResponse
@SpringBootApplication
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }
}
2.2.3 Controller層

引入Graceful Response后,我們不需要再手工進行查詢結果的封裝,直接返回實際結果即可,Graceful Response會自動完成封裝的操作。

Controller層示例如下。

@Controller
public class Controller {
    @RequestMapping("/get")
    @ResponseBody
    public UserInfoView get(Long id) {
        log.info("id={}", id);
        return UserInfoView.builder().id(id).name("name" + id).build();
    }
}

在示例代碼中,Controller層的方法直接返回了UserInfoView對象,沒有進行封裝的操作,但經過Graceful Response處理后,我們還是得到了以下的響應結果。

{
  "status": {
    "code": "0",
    "msg": "ok"
  },
  "payload": {
    "id": 1,
    "name": "name1"
  }
}

而對于命令操作(Command)盡量不返回數據,因此command操作的方法的返回值應該是void,Graceful Response對于對于返回值類型void的方法,也會自動進行封裝。

public class Controller {
    @RequestMapping("/command")
    @ResponseBody
    public void command() {
        //業務操作
    }
}

成功調用該接口,將得到:

{
  "status": {
    "code": "200",
    "msg": "success"
  },
  "payload": {}
}
2.2.4 Service層

在引入Graceful Response前,有的開發者在定義Service層的方法時,為了在接口中返回異常碼,干脆直接將Service層方法定義為Response,淹沒了方法的正常返回值。

Response的代碼如下。

//lombok注解
@Data
public class Response {
    private String code;
    private String msg;
    private Object data;
}

直接返回Response的Service層方法:

/**
 * 直接返回Reponse的Service
 * 不規范
 */
public interface Service {
    public Reponse commandMethod(Command command);
}

Graceful Response引入@ExceptionMapper注解,通過該注解將異常和錯誤碼關聯起來,這樣Service方法就不需要再維護Response的響應碼了,直接拋出業務異常,由Graceful Response進行異常和響應碼的關聯。搜索我是程序汪公眾號,回復“面試寶典”,送你一份Java面試寶典

@ExceptionMapper的用法如下。

/**
 * NotFoundException的定義,使用@ExceptionMapper注解修飾
 * code:代表接口的異常碼
 * msg:代表接口的異常提示
 */
@ExceptionMapper(code = "1404", msg = "找不到對象")
public class NotFoundException extends RuntimeException {

}

Service接口定義:

public interface QueryService {
    UserInfoView queryOne(Query query);
}

Service接口實現:

public class QueryServiceImpl implements QueryService {
    @Resource
    private UserInfoMapper mapper;

    public UserInfoView queryOne(Query query) {
        UserInfo userInfo = mapper.findOne(query.getId());
        if (Objects.isNull(userInfo)) {
            //這里直接拋自定義異常
            throw new NotFoundException();
        }
        //……后續業務操作
    }
}

當Service層的queryOne方法拋出NotFoundException時,Graceful Response會進行異常捕獲,并將NotFoundException對應的異常碼和異常信息封裝到統一的響應對象中,最終接口返回以下JSON。

{
  "status": {
    "code": "1404",
    "msg": "找不到對象"
  },
  "payload": {}
}
2.2.5 參數校驗

Graceful Response對JSR-303數據校驗規范和Hibernate Validator進行了增強,Graceful Response自身不提供參數校驗的功能,但是用戶使用了Hibernate Validator后,Graceful Response可以通過@ValidationStatusCode注解為參數校驗結果提供響應碼,并將其統一封裝返回。

例如以下的UserInfoQuery。

@Data
public class UserInfoQuery {
    @NotNull(message = "userName is null !")
    @Length(min = 6, max = 12)
    @ValidationStatusCode(code = "520")
    private String userName;
}

UserInfoQuery對象中定義了@NotNull和@Length兩個校驗規則,在未引入Graceful Response的情況下,會直接拋出異常;

在引入Graceful Response但是沒有加入@ValidationStatusCode注解的情況下,會以默認的錯誤碼進行返回;

在上面的UserInfoQuery中由于使用了@ValidationStatusCode注解,并指定異常碼為520,則當userName字段任意校驗不通過時,都會使用異常碼520進行返回,如下。

{
  "status": {
    "code": "520",
    "msg": "userName is null !"
  },
  "payload": {}
}

而對于Controller層直接校驗方法入參的場景,Graceful Response也進行了增強,如以下Controller。

public class Controller {

    @RequestMapping("/validateMethodParam")
    @ResponseBody
    @ValidationStatusCode(code = "1314")
    public void validateMethodParam(
            @NotNull(message = "userId不能為空") Long userId,
            @NotNull(message = "userName不能為空") Long userName) {
        //省略業務邏輯
    }
}

如果該方法入參校驗觸發了userId和userName的校驗異常,將以錯誤碼1314進行返回,如下。

{
  "status": {
    "code": "1314",
    "msg": "userId不能為空"
  },
  "payload": {}
}
2.2.6 自定義Response格式

Graceful Response內置了兩種風格的響應格式,并通過graceful-response.response-style進行配置。

graceful-response.response-style=0,或者不配置(默認情況),將以以下的格式進行返回:

{
  "status": {
    "code": 1007,
    "msg": "有內鬼,終止交易"
  },
  "payload": {
  }
}

graceful-response.response-style=1,將以以下的格式進行返回:

{
  "code": "1404",
  "msg": "not found",
  "data": {
  }
}

如果這兩種格式均不滿足業務需要,Graceful Response也支持用戶自定義響應體,關于自定義響應體的技術實現,請到自定義Response格式進行了解。

本項目提供的進階功能,包括

  • 第三方組件汽車(Swagger、執行器等)
  • 自定義響應
  • 異常請求放行
  • 異常別名
  • 常用配置項

目前該組件在GitHub上已經有兩百多Star,很多朋友已經開始用了,大家可以通過下方鏈接了解下:

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2023-12-24 12:44:47

SpringBoot代碼接口開發

2025-06-30 02:44:00

SpringBoot開發優化

2024-09-06 08:02:52

2025-04-18 04:22:00

2023-12-26 15:14:00

2021-05-31 18:56:56

代碼編碼開發

2020-08-05 07:50:40

開發編輯器技術

2025-08-29 10:00:00

JavaScript瀏覽器API

2020-12-13 17:54:36

開發人員

2023-08-01 10:31:03

工具平臺插件化

2023-04-27 13:16:45

2024-12-20 12:30:00

Python'|'代碼

2021-01-27 11:36:34

代碼開發工具

2023-09-12 23:15:08

Shell腳本

2024-03-08 09:35:25

2025-09-05 00:00:00

前端開發AI

2023-11-23 19:36:58

2024-04-10 14:08:00

人工智能開發工具

2023-09-25 10:02:00

GitVS Code

2020-12-04 07:49:54

AICtrl C代碼
點贊
收藏

51CTO技術棧公眾號

日韩欧美中文在线观看| 成人免费视频国产免费麻豆| 欧美极品在线观看| 91久久精品国产91性色tv| 欧美一进一出视频| 欧美日韩 一区二区三区| 精品国产一区二区三区小蝌蚪| 一本色道久久综合亚洲精品按摩| 日韩欧美三级电影| 国产精品女同一区二区| 亚洲承认在线| 欧美一区二区三区在线视频| 成人在线视频一区二区三区| 日韩精品系列| 麻豆免费看一区二区三区| 精品激情国产视频| 人妻av一区二区| 99蜜月精品久久91| 亚洲成人中文在线| 色噜噜色狠狠狠狠狠综合色一| 国产精品美女一区| 亚洲综合国产激情另类一区| 亚洲天堂免费在线| 欧美69精品久久久久久不卡 | 日韩毛片免费观看| 国产精品久久一级| av资源站久久亚洲| 国产天堂第一区| 欧美涩涩网站| 中文字幕无线精品亚洲乱码一区| 熟妇女人妻丰满少妇中文字幕| 亚洲天堂av在线| 亚洲色图清纯唯美| 欧美大香线蕉线伊人久久| 97人妻人人澡人人爽人人精品| 伊人精品在线| 国产亚洲欧美一区| 成人在线电影网站| 国产精品99久久免费| 一本大道av一区二区在线播放| 在线观看成人免费| 不卡在线视频| 91丨porny丨在线| 亚洲精品日韩av| 啪啪小视频网站| 亚洲精选在线| 欧美另类暴力丝袜| 少妇一级黄色片| 曰本一区二区三区视频| 日韩欧美成人一区| 欧美成年人视频在线观看| 性欧美freesex顶级少妇| 亚洲天堂精品视频| 午夜久久资源| 国产九色在线| 久久久亚洲精品石原莉奈| 国产高清自拍一区| 91久久精品国产91性色69| 亚洲一区黄色| 午夜精品福利视频| 久久国产精品波多野结衣av| 五月综合激情| 久久综合久久美利坚合众国| 又嫩又硬又黄又爽的视频| 欧美精品尤物在线观看 | 久久影视免费观看| 二区三区四区视频| 水蜜桃精品av一区二区| 亚洲欧美日本精品| 国产精品揄拍100视频| 欧美三级午夜理伦三级小说| 日韩美一区二区三区| 久久久久久久久久久久久久久国产 | 丰满岳乱妇一区二区| 日韩精品一区二区三区免费视频| 欧美美女喷水视频| 天堂在线中文在线| 亚洲视频自拍| 欧美一区二区三区色| 日本黄色福利视频| 国产 日韩 欧美| 911精品国产一区二区在线| 久热精品在线播放| **国产精品| 欧美裸体一区二区三区| www.久久av.com| 超碰国产精品一区二页| 555www色欧美视频| 超碰人人cao| 激情小说一区| 精品久久久久久久久久久久包黑料| 91女神在线观看| 国产午夜精品一区在线观看| 精品少妇一区二区三区| 少妇一级淫免费观看| 同性恋视频一区| 国产亚洲一区二区在线| 秋霞欧美一区二区三区视频免费| 午夜精品久久久久99热蜜桃导演| 久久久伊人日本| 亚洲熟女综合色一区二区三区| 爽好多水快深点欧美视频| 国产精品美女www| 国产精品高潮呻吟AV无码| 国产91精品露脸国语对白| 精品一区二区久久久久久久网站| 不卡在线视频| 国产精品嫩草99a| 欧美图片激情小说| 亚洲www啪成人一区二区| 777色狠狠一区二区三区| 在线观看免费视频黄| 国产精选一区| 欧美另类交人妖| 国产在线观看黄色| 蜜桃在线一区二区三区| 成人资源av| 国产二区在线播放| 一区二区三区四区蜜桃| 男女av免费观看| 激情亚洲小说| 亚洲精品国产精品国自产在线 | 久久久久亚洲蜜桃| 欧美日韩dvd| 日韩精品免费观看视频| 欧美本精品男人aⅴ天堂| 性欧美一区二区| 伊人久久婷婷| 91久久国产综合久久91精品网站| 亚洲av成人精品日韩在线播放| 国产精品免费网站在线观看| 国产69精品久久久久久久| 香蕉成人在线| 亚洲码在线观看| 少妇高潮在线观看| 久久国产日本精品| 成人情视频高清免费观看电影| 黄色av网站在线| 亚洲成av人片在线观看| 日韩a一级欧美一级| 国产91精品对白在线播放| 欧美成人免费va影院高清| 亚洲 欧美 日韩 在线| 丁香激情综合五月| 99久re热视频精品98| 97人人做人人爽香蕉精品| 国产视频亚洲视频| 国产成人一区二区三区影院在线| 国产乱码精品一区二区三| 婷婷久久青草热一区二区| 中文字幕在线看片| 日韩av在线网页| 神马午夜精品91| 琪琪一区二区三区| 欧美日本韩国一区二区三区| а_天堂中文在线| 日韩欧美自拍偷拍| 欧洲第一无人区观看| 精品制服美女久久| 亚洲一区二区三区在线观看视频 | 亚洲六月丁香色婷婷综合久久 | 日韩av成人高清| 欧美极品jizzhd欧美| 在线天堂资源| 日韩精品视频三区| 中文字幕亚洲精品在线| a在线播放不卡| 无码专区aaaaaa免费视频| 懂色av一区二区| 高清视频欧美一级| 国产尤物视频在线| 欧美福利一区二区| 欧美人妻精品一区二区免费看| 成人av资源在线观看| 日本wwww视频| 水蜜桃精品av一区二区| 成人av资源网| 成人直播视频| 久久精品福利视频| 手机看片1024国产| 欧美亚一区二区| 九九热只有精品| av在线不卡电影| 男人搞女人网站| 欧美二区视频| 久久99精品久久久久久久青青日本| abab456成人免费网址| 久国内精品在线| 久久天堂电影| 日韩三级视频在线看| 亚洲综合图片网| 亚洲精品日韩专区silk| 日韩人妻无码一区二区三区| 久久99久久99| 成人黄色片视频| 欧美成人久久| 日本一区二区高清视频| 日韩视频一区二区三区四区| 国产97免费视| 国产蜜臀av在线播放| 中文字幕亚洲二区| 头脑特工队2在线播放| 制服丝袜亚洲精品中文字幕| 99热在线观看免费精品| 亚洲码国产岛国毛片在线| 国产肥白大熟妇bbbb视频| 国产精品99久久久久久宅男| 999香蕉视频| 精品99视频| 精品久久免费观看| av资源久久| 欧美精品在线一区| 粉嫩久久久久久久极品| 成人免费xxxxx在线观看| 国产成人精品亚洲日本在线观看| 久久久噜久噜久久综合| 成人免费观看视频大全| 在线观看中文字幕亚洲| 五月婷婷丁香花| 亚洲精品在线观看网站| 精品国产乱码一区二区三| 欧美日韩亚洲丝袜制服| 黄色片视频免费| 欧美性猛交99久久久久99按摩| 免费一级片在线观看| 亚洲欧洲国产日本综合| 日本美女bbw| 久久美女艺术照精彩视频福利播放 | 欧美日本亚洲| 欧美国产不卡| 国产一区二区三区四区五区加勒比| 成人综合日日夜夜| 国产欧美在线视频| 国产成人精品一区二区三区免费| 欧美最猛性xxxxx(亚洲精品)| av剧情在线观看| 久久久久久久影院| japanese色国产在线看视频| 欧美精品免费在线| 成人在线直播| 草民午夜欧美限制a级福利片| 日本在线www| 色悠悠久久88| 麻豆视频免费在线观看| 日韩色av导航| 国产美女av在线| 伦伦影院午夜日韩欧美限制| 黄网页免费在线观看| 俺去啦;欧美日韩| av毛片在线免费| 欧美日韩999| 黄页网站在线| 性色av一区二区三区免费| 国产三级电影在线播放| 欧美亚洲成人xxx| 周于希免费高清在线观看| 国产91在线高潮白浆在线观看| 日韩精品影院| 国产一区二区丝袜高跟鞋图片| 日韩三级一区| 国产成人女人毛片视频在线| 国产精品调教视频| 欧美高清性xxxxhd| 大胆日韩av| 黄色一级视频播放| 亚洲啪啪91| av视屏在线播放| 狠狠色丁香婷综合久久| 精品国产一二区| 99re亚洲国产精品| 欧美 日韩 成人| 亚洲乱码一区二区三区在线观看| 国产精品30p| 91久久国产综合久久| 国产精品天天操| 亚洲高清福利视频| 成人免费在线电影| 美女福利精品视频| 欧美一级鲁丝片| 成人黄色免费在线观看| 国产乱人伦精品一区| 日本一区免费看| 最新精品国产| 蜜臀久久99精品久久久酒店新书| 蜜桃精品视频在线| 欧美xxxxx少妇| 国产精品网站在线观看| 国产一级淫片免费| 欧美日韩一级片网站| 好吊色一区二区三区| 国产亚洲精品va在线观看| 羞羞网站在线免费观看| 国产999精品视频| 蜜桃精品视频| 欧美在线3区| 国产在线日韩| 欧美第一页浮力影院| 不卡视频一二三四| 国产又粗又猛又爽又黄的视频小说| 亚洲成av人影院| 国产内射老熟女aaaa∵| 亚洲日本欧美中文幕| 欧美寡妇性猛交xxx免费| 国产精品天天狠天天看| 美女视频亚洲色图| 特级西西444| 乱一区二区av| 色婷婷在线影院| 亚洲午夜激情av| 国产精品久久久久久久久毛片 | 国产经典一区| 国产日韩欧美二区| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 欧美黑人巨大xxxxx| av免费观看久久| 天天色天天射综合网| 手机在线免费观看毛片| 成人午夜视频免费看| 男人av资源站| 欧美性生活影院| 女人天堂在线| 992tv成人免费影院| 一区三区自拍| 色爽爽爽爽爽爽爽爽| 美女性感视频久久| 少妇精品无码一区二区免费视频 | 这里只有久久精品视频| 日韩av在线直播| av在线理伦电影| 春色成人在线视频| 午夜精品剧场| 人妻互换一二三区激情视频| 亚洲少妇屁股交4| 一级黄色大片免费观看| 亚洲视屏在线播放| 自拍偷自拍亚洲精品被多人伦好爽| 精品无人区一区二区三区竹菊| 亚洲视屏一区| 一级黄色片毛片| 亚洲图片欧美视频| 黄色a在线观看| 国内精品久久久久影院 日本资源| 亚洲一区二区三区在线免费 | 波多野结衣一二三四区| 在线一区二区观看| 国产98在线| 国产免费观看久久黄| 欧美第一精品| 欧美日韩理论片| 亚洲激情欧美激情| 亚洲国产av一区二区| 国外成人性视频| 欧美人体视频| 男女视频一区二区三区| 国产精品日韩精品欧美在线| 一本一道人人妻人人妻αv| 精品国产一区久久久| 日韩在线精品强乱中文字幕| 97碰在线视频| 99r国产精品| 无码人妻精品一区二| 在线性视频日韩欧美| 国产精品久久久久久久久久辛辛 | 欧洲亚洲两性| 亚洲草草视频| 国产曰批免费观看久久久| 九九视频在线观看| 日韩精品在线观| av在线不卡精品| 大地资源网在线观看免费官网| 成人一区二区三区中文字幕| 天天干在线播放| 日韩在线精品一区| aiss精品大尺度系列| 国产成人无码一二三区视频| 中文字幕一区二区三区四区| www.黄色片| 日韩av免费看| 一区二区电影在线观看| 国产精品久久无码| 欧美性视频一区二区三区| 在线观看男女av免费网址| 精品一区二区久久久久久久网站| 日本伊人精品一区二区三区观看方式| 波兰性xxxxx极品hd| 欧美大片国产精品| 亚洲第一会所| 国产1区2区3区中文字幕| 久久综合999| 精品国产999久久久免费| 欧美在线亚洲一区| 亚洲最新色图| av女人的天堂| 精品日产卡一卡二卡麻豆| 国产第一亚洲| 欧美在线观看成人| 综合激情成人伊人| 精品999视频| 成人9ⅰ免费影视网站| 蜜桃一区二区三区四区|