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

一招搞定!Spring Boot 3.4 + OpenAPI Generator 實現類型安全的通用 API 響應

開發 前端
在實際項目中,這樣的優化能大幅減少冗余代碼,讓微服務的 API 客戶端更清晰、更易維護。如果你正在為“響應封裝類爆炸”而頭痛,不妨一試這套方案。

在日常開發中,構建簡潔且可維護的 API 已經夠難了,而一旦涉及到 自動生成的 API 客戶端,情況往往會更加混亂。團隊常常不得不在每個接口上重復包裝響應體,或者編寫大量冗余的對象映射器。

本文結合 Spring Boot 3.4 + OpenAPI Generator,展示如何通過輕量化定制,實現真正的 泛型化、類型安全 的 API 響應模型。例如,讓生成的客戶端直接支持:

ApiClientResponse<CustomerCreateResponse>

而不是到處充斥重復字段的類。

通過這種方式,我們可以去掉幾十個手寫的響應封裝類,減少樣板代碼,同時保持調用端的代碼簡潔、統一且具備強類型保障。

問題背景

大多數后端團隊會約定統一的響應體結構,例如:

public class ApiResponse<T> {
    private Integer status;
    private String message;
    private List<ErrorDetail> errors;
    private T data;
}

這樣控制器的返回結果就能保持一致:

@PostMapping("/v1/customers")
public ResponseEntity<ApiResponse<CustomerCreateResponse>> createCustomer(
    @Valid @RequestBody CustomerCreateRequest request) {
    var result = customerService.createCustomer(request);
    return ResponseEntity.ok(ApiResponse.success(result));
}

問題在于:OpenAPI Generator 默認并不支持泛型。它會為每個接口生成一個專用包裝類,比如:

public class ApiResponseCustomerCreateResponse {
  private Integer status;
  private String message;
  private List<ApiResponseErrorsInner> errors;
  private CustomerCreateResponse data;
}

雖然字段和類型都沒問題,但會導致:

  • 每個接口都生成一套幾乎一樣的響應類;
  • 包內充斥大量重復字段;
  • 一旦響應體契約有改動,所有 wrapper 都要重新生成,維護負擔極高。

這就是為什么在大型微服務架構中,重復響應類逐漸演變為技術債務

解決方案:一個泛型基類 + 輕量外殼類

我們希望所有接口共享同一個基礎泛型類 ApiClientResponse<T>,同時通過模板生成僅繼承該類的“薄殼類”。

例如:

public class ApiResponseCustomerCreateResponse extends ApiClientResponse<CustomerCreateResponse> {}

而基礎泛型類只需定義一次:

package com.icoderoad.api.common;


public class ApiClientResponse<T> {
    private Integer status;
    private String statusText;
    private String message;
    private List<ApiClientError> errors;
    private T data;


    public T getData() { return data; }
    // setters、equals、hashCode、toString
}


public record ApiClientError(String errorCode, String message) {}

這樣:

  • 字段只在一個地方維護;
  • 類型安全完全保留(getData() 返回的就是目標對象);
  • 一旦需要增加全局元數據,只需改動 ApiClientResponse<T>

核心實現步驟

自定義 OpenAPI Schema

通過 OpenApiCustomizer,在 OpenAPI 文檔生成時給響應模型打標記,明確區分“泛型封裝類”:

@Configuration
public class SwaggerResponseCustomizer {


  @Bean
  OpenApiCustomizer responseCustomizer() {
    return openApi -> {
      // 定義基礎響應體
      openApi.getComponents().addSchemas("ApiResponse",
          new ObjectSchema()
              .addProperty("status", new IntegerSchema().format("int32"))
              .addProperty("statusText", new StringSchema())
              .addProperty("message", new StringSchema())
              .addProperty("errors", new ArraySchema().items(
                  new ObjectSchema()
                      .addProperty("errorCode", new StringSchema())
                      .addProperty("message", new StringSchema())))
      );


      // 為具體的 CustomerCreateResponse 包裝響應
      openApi.getComponents().addSchemas(
          "ApiResponseCustomerCreateResponse",
          composed("CustomerCreateResponse"));
    };
  }


  private Schema<?> composed(String ref) {
    var schema = new ComposedSchema();
    schema.setAllOf(List.of(
        new Schema<>().$ref("#/components/schemas/ApiResponse"),
        new ObjectSchema().addProperty("data",
            new Schema<>().$ref("#/components/schemas/" + ref))
    ));
    schema.addExtension("x-api-wrapper", true);
    schema.addExtension("x-api-wrapper-datatype", ref);
    return schema;
  }
}

這里的關鍵在于給 Schema 添加擴展字段 x-api-wrapper,方便模板識別。

定制 Mustache 模板

我們只需添加一個很小的模板片段 api_wrapper.mustache

public class {{classname}}
    extends com.icoderoad.api.common.ApiClientResponse<{{vendorExtensions.x-api-wrapper-datatype}}> {
}

然后在 model.mustache 中進行條件判斷:

{{#vendorExtensions.x-api-wrapper}}
  {{>api_wrapper}}
{{/vendorExtensions.x-api-wrapper}}
{{^vendorExtensions.x-api-wrapper}}
  {{>pojo}}
{{/vendorExtensions.x-api-wrapper}}

這樣,凡是帶 x-api-wrapper 標記的模型,就會生成繼承泛型基類的薄殼類。

配置 OpenAPI Generator

在 pom.xml 中指定自定義模板目錄:

<plugin>
  <groupId>org.openapitools</groupId>
  <artifactId>openapi-generator-maven-plugin</artifactId>
  <version>${openapi.generator.version}</version>
  <executions>
    <execution>
      <id>generate-client</id>
      <goals><goal>generate</goal></goals>
      <configuration>
        <inputSpec>${project.basedir}/src/main/resources/customer-api.yaml</inputSpec>
        <generatorName>java</generatorName>
        <library>restclient</library>
        <output>${project.build.directory}/generated-sources/openapi</output>
        <templateDirectory>${project.basedir}/src/main/resources/openapi-templates</templateDirectory>
        <apiPackage>com.icoderoad.generated.api</apiPackage>
        <modelPackage>com.icoderoad.generated.dto</modelPackage>
        <invokerPackage>com.icoderoad.generated.invoker</invokerPackage>
      </configuration>
    </execution>
  </executions>
</plugin>

生成效果

最終生成的客戶端響應類會非常簡潔:

public class ApiResponseCustomerCreateResponse 
    extends ApiClientResponse<CustomerCreateResponse> {}

而在客戶端調用時,既可以用泛型基類,也可以用薄殼類:

// 推薦方式:直接用泛型基類
ApiClientResponse<CustomerCreateResponse> res =
    customerControllerApi.createCustomer(createRequest);
CustomerCreateResponse created = res.getData();


// 也可顯式使用薄殼類
ApiResponseCustomerCreateResponse res2 =
    customerControllerApi.createCustomer(createRequest);
CustomerCreateResponse created2 = res2.getData();

這樣既保持了類型安全,又避免了無意義的重復類。

適用場景與注意事項

適合場景

  • 多數接口共享統一響應封裝;
  • 希望減少客戶端模型數量;
  • 需要在一個地方集中管理通用字段。

不適合場景

  • 各接口返回體差異過大;
  • 消費端只想獲取原始數據,無需統一封裝。

結論

通過 OpenApiCustomizer + Mustache 模板 的組合,我們成功讓 OpenAPI Generator 支持生成 泛型化的統一響應封裝

相比原始生成結果,這種方案具備以下優勢:

  • 無需重復定義幾十個 wrapper 類;
  • 客戶端調用代碼保持簡潔且類型安全;
  • 后期擴展字段時,只需在泛型基類中修改一次即可。

在實際項目中,這樣的優化能大幅減少冗余代碼,讓微服務的 API 客戶端更清晰、更易維護。如果你正在為“響應封裝類爆炸”而頭痛,不妨一試這套方案。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2022-09-06 11:53:00

開發計算

2020-12-31 13:17:57

手機電腦多屏協同

2010-03-16 08:59:45

Windows 7純凈版安裝

2025-02-17 00:00:45

接口支付寶沙箱

2025-02-17 07:48:45

2021-12-13 06:56:46

TCP孤兒連接

2020-10-20 08:01:30

MySQL密碼Windows

2025-10-23 08:21:40

2023-12-18 08:24:09

LinuxPythonWord

2021-03-06 09:54:22

PythonHTTP請求頭

2015-08-03 14:02:37

Windows 10升級

2025-04-08 08:01:31

2012-02-01 15:41:42

2025-04-18 09:49:48

2022-01-25 13:00:52

前端設計優化

2025-09-01 07:37:44

2021-08-21 23:33:16

iOS蘋果系統

2025-04-27 03:00:00

Spring集成測試

2022-06-21 09:27:01

PythonFlaskREST API

2013-07-30 11:24:33

SAP“簡化IT 一招
點贊
收藏

51CTO技術棧公眾號

精品欧美在线观看| 糖心vlog免费在线观看| 三上悠亚一区二区| 国产精品高潮呻吟| 国产一区二区高清视频| 日韩xxx视频| 午夜日韩电影| 亚洲欧美国产一本综合首页| 777一区二区| 亚洲一级少妇| 亚洲人成网站影音先锋播放| 国产美女在线精品免费观看| 天堂免费在线视频| 伊人成人在线视频| 中文字幕免费精品一区| 精品伦一区二区三区| 色8久久影院午夜场| 亚洲日本电影在线| 欧美日韩高清在线一区| 精品国产va久久久久久久| 久久一二三四| 国模叶桐国产精品一区| 国产精品suv一区二区88| 日韩最新在线| 日韩亚洲欧美在线| 在线观看岛国av| 日韩免费小视频| 婷婷亚洲久悠悠色悠在线播放| 亚洲人一区二区| 嫩草研究院在线| 国产精品88888| 国产欧美日韩最新| 在线观看日本网站| 中文在线一区| 欧美日本啪啪无遮挡网站| 久久久久亚洲AV成人无在| 国产精品三p一区二区| 一本一本大道香蕉久在线精品| 成人毛片100部免费看| 成人午夜在线观看视频| 久久久亚洲综合| 久久久精品动漫| 欧美一级淫片aaaaaa| 国产九色精品成人porny| 国产精品日韩av| 一二三区免费视频| 黑人一区二区三区四区五区| 久久精品91久久香蕉加勒比| 潮喷失禁大喷水aⅴ无码| 国产日产精品_国产精品毛片| 亚洲精品国产福利| 在线免费观看a级片| 久久久久久久久久久久久久久久久久久久 | 久久久久中文| 欧洲美女7788成人免费视频| 欧美一级视频免费观看| 一道本一区二区| 91精品国产乱码久久久久久久久 | 一本一道综合狠狠老| 亚洲色成人一区二区三区小说| 大香伊人中文字幕精品| 亚洲国产wwwccc36天堂| 成年人网站免费视频| 麻豆mv在线观看| 欧美午夜电影在线| 国产一区视频免费观看| 国产成人久久精品麻豆二区| 欧美三级视频在线| 欧美日韩理论片| 视频欧美一区| 亚洲加勒比久久88色综合| 亚洲天堂网一区二区| 亚洲尤物av| 中文字幕精品在线视频| 国产精品九九九九九九| 亚洲福利久久| 国产91精品最新在线播放| 美女黄页在线观看| 国产成人精品一区二| 精品一区二区久久久久久久网站| 欧美理论在线观看| 亚洲欧美一区二区在线观看| 成人在线免费观看网址| 久草在线资源福利站| 在线国产亚洲欧美| 手机在线免费毛片| 欧美精品国产白浆久久久久| 亚洲天堂av在线免费| 91香蕉视频污在线观看| 在线欧美福利| 国产精品欧美一区二区| 精品国产av鲁一鲁一区| 久久美女高清视频| 综合色婷婷一区二区亚洲欧美国产| 99热国产在线中文| 日韩欧美国产网站| 日本成人xxx| 欧美猛男男男激情videos| 北条麻妃在线一区二区| 国产成人在线免费观看视频| 日日摸夜夜添夜夜添亚洲女人| 91麻豆国产语对白在线观看| 欧洲一区av| 亚洲欧美一区二区三区极速播放| 黄色免费福利视频| 日本一区二区三区中文字幕| 亚洲国产精品女人久久久| 美国美女黄色片| 国产精品日韩欧美一区| 国产这里只有精品| 美国一级片在线免费观看视频| 亚洲猫色日本管| 男人女人黄一级| 久久精品色综合| 欧美大成色www永久网站婷| www.久久视频| 91原创在线视频| 超碰超碰超碰超碰超碰| 免费高清视频在线一区| 亚洲激情视频在线| 国产一级二级毛片| 国产一区高清在线| 亚洲精品国产精品久久| 成人美女黄网站| 亚洲国产日韩精品在线| 九九视频在线免费观看| 久久69国产一区二区蜜臀| 日本不卡一区二区三区在线观看| 免费在线看污片| 制服.丝袜.亚洲.中文.综合| 中文字幕免费视频| 羞羞视频在线观看欧美| 国内一区在线| 丁香花高清在线观看完整版| 欧美一区二区三区爱爱| 欧美激情精品久久久久久免费| 久久精品一区二区国产| 久久99欧美| 亚洲性色av| 国产丝袜精品视频| 亚洲天堂一区在线| 91麻豆精品一区二区三区| 2019日韩中文字幕mv| 伊人久久噜噜噜躁狠狠躁| 久久久www成人免费精品| 糖心vlog精品一区二区| 日本一区二区三区免费乱视频 | 亚洲国产精品va在看黑人| 欧美精品xxxxx| 丁香桃色午夜亚洲一区二区三区| 免费观看国产视频在线| 警花av一区二区三区| 久久国产天堂福利天堂| 精品久久人妻av中文字幕| 一区二区三区影院| 久草免费资源站| 日韩一级大片| 欧美午夜精品久久久久久蜜| 国产精品久久久久av电视剧| 伊人久久大香线蕉av一区二区| 欧美性受xxx黑人xyx性爽| 亚洲国产精品v| 欧美一级小视频| 欧美日韩国产欧| 国产综合av一区二区三区| 人人草在线观看| 九九热播视频在线精品6 | 国产精品久久久久久福利| 在线观看成人免费视频| 日本污视频网站| 久久精品国产亚洲aⅴ| 中日韩在线视频| 秋霞影院一区| 高清欧美性猛交xxxx| 四虎影视在线观看2413| 91成人国产精品| 女同久久另类69精品国产| 风间由美性色一区二区三区| 成人午夜免费在线| 国产一区二区三区探花| 成人精品视频久久久久| 福利在线导航136| 亚洲欧美国产一区二区三区| 中文字幕日韩三级| 亚洲一区二区中文在线| 深爱五月激情网| 国精产品一区一区三区mba桃花 | 日韩国产在线看| 中文字幕人妻一区二区在线视频| 亚洲欧美日韩久久| 素人fc2av清纯18岁| 另类欧美日韩国产在线| 国产曰肥老太婆无遮挡| 成人同人动漫免费观看| 国产伦精品一区| 国产69精品久久| 91国内在线视频| 嫩草在线视频| 亚洲精品日韩在线| 亚洲av无码国产精品久久不卡| 日韩欧美亚洲一二三区| www.99re7| 国产亚洲精品福利| 中文字幕一区二区人妻电影丶| 日韩精品一级中文字幕精品视频免费观看| 最近免费观看高清韩国日本大全| 亚洲黄页网站| 亚洲一区精品电影| 黑人精品一区| 97国产精品视频| 国产网友自拍视频导航网站在线观看| 亚洲精品美女免费| 国产成人精品白浆久久69| 欧美调教femdomvk| 成年免费在线观看| 一区二区三区四区激情 | 亚洲免费观看在线视频| 久久精品视频18| 99久久国产综合精品麻豆| 潘金莲一级淫片aaaaaaa| 蜜桃av一区二区三区| 日韩 欧美 高清| 最新日韩欧美| 成年在线观看视频| 91精品国产麻豆国产在线观看| 欧美三级华人主播| 女人抽搐喷水高潮国产精品| 91日本在线视频| 日本午夜免费一区二区| 国产精品第三页| 成人影院av| 97精品久久久中文字幕免费| 污污视频在线| 蜜臀久久99精品久久久无需会员| 成年午夜在线| 亚洲视频一区二区| 蜜芽tv福利在线视频| 亚洲精品一区二区三区四区高清| 精品久久久久久亚洲综合网站| 欧美日韩免费一区二区三区 | 精品在线你懂的| 中文字幕免费高清在线| 蜜臂av日日欢夜夜爽一区| 婷婷丁香激情网| 日韩国产高清在线| 性刺激的欧美三级视频| 日韩电影免费一区| 日本超碰在线观看| 精品影院一区二区久久久| 亚洲一级片av| 丰满白嫩尤物一区二区| 亚洲精品激情视频| av欧美精品.com| 亚洲av无码一区二区三区人 | 久久99精品国产| 红桃视频一区二区三区免费| 国产一区二区免费在线| 91porn在线| 久久综合九色综合欧美就去吻| 欧美熟妇一区二区| 亚洲国产精品激情在线观看| 卡一卡二卡三在线观看| 国产精品久久久久精k8| 91嫩草|国产丨精品入口| 一级中文字幕一区二区| 日韩黄色a级片| 欧美性色xo影院| 在线观看亚洲国产| 日韩美女视频在线| 婷婷色在线观看| 在线日韩中文字幕| 粗大黑人巨茎大战欧美成人| 久久久亚洲国产天美传媒修理工| 免费v片在线观看| 国产精品久久久久久久美男| 亚洲日本免费电影| 丁香五月网久久综合| 婷婷五月色综合香五月| 一区二区三区四区欧美| 欧美三级网页| 免费观看成人在线视频| 久久97超碰色| 大地资源二中文在线影视观看| 国产日韩欧美高清| 九九九免费视频| 欧美中文字幕不卡| 亚洲精品字幕在线| 国产亚洲视频在线观看| 少女频道在线观看高清 | 天天综合91| 久久精品国产第一区二区三区最新章节 | 伊色综合久久之综合久久| 欧美日韩一区二区三区免费| 91久久夜色精品国产按摩| 自拍日韩亚洲一区在线| 免费成人美女在线观看| 日韩Av无码精品| 日韩一区日韩二区| 国产精品suv一区| 制服丝袜亚洲色图| 九色在线免费| 久久久久亚洲精品国产| 成人国产一区| 另类欧美小说| 激情另类综合| av中文字幕网址| 国产亚洲女人久久久久毛片| 久久国产精品二区| 欧美猛男男办公室激情| 日韩二区三区| 欧美激情一区二区三区高清视频| 成人黄色在线| 免费av在线一区二区| 好看的av在线不卡观看| 九九热免费在线观看| 91色婷婷久久久久合中文| 清纯粉嫩极品夜夜嗨av| 欧美日韩www| 国产女主播在线写真| 国产91对白在线播放| 97久久综合精品久久久综合| 异国色恋浪漫潭| 免费黄网站欧美| 熟女俱乐部一区二区| 婷婷六月综合网| 日日夜夜精品免费| 欧美激情va永久在线播放| 91麻豆精品一二三区在线| 亚洲一区二区在线免费观看| 久久久精品性| 性欧美精品中出| 欧美日韩性视频在线| 日韩一卡二卡在线| 欧美激情一级二级| 欧美专区视频| 警花观音坐莲激情销魂小说| 另类综合日韩欧美亚洲| 亚洲精品成人av久久| 在线观看精品一区| 波多野结衣在线网站| 国产精品第一视频| 欧美视频网址| 欧美一级特黄a| 国产欧美精品一区aⅴ影院| 无码人妻精品一区二区三区9厂| 日韩精品www| 中文字幕在线直播| 日本成人黄色| 蜜桃视频第一区免费观看| 亚洲综合图片一区| 777亚洲妇女| 91麻豆免费在线视频| 91久久精品www人人做人人爽| 欧美一区激情| 污免费在线观看| 亚洲va中文字幕| 深夜福利免费在线观看| 国产成人综合久久| 围产精品久久久久久久| 激情成人在线观看| 亚洲福利视频一区| 午夜影院免费体验区| 欧亚精品中文字幕| 欧美一区二区麻豆红桃视频| 国产精品自在自线| 亚洲一区影音先锋| 久久精品蜜桃| 国产日产亚洲精品| 欧美日韩综合| 西西444www无码大胆| 欧美日韩一区二区电影| 中文字幕在线播放网址| 精品久久久久久中文字幕动漫| 午夜一区在线| 欧美自拍偷拍网| 日韩三级av在线播放| 欧亚av在线| 亚洲第一在线综合在线| 国产精品自拍毛片| 51国产偷自视频区视频| 色爱av美腿丝袜综合粉嫩av | 欧美精品一区二区三区四区| 丝袜诱惑一区二区| 中文字幕一区二区三区乱码| 国产成人精品免费网站| 少妇高潮av久久久久久| 久久天天躁狠狠躁夜夜躁2014| 激情视频极品美女日韩| 日日摸天天爽天天爽视频| 亚洲人精品午夜| 精品电影在线| 99热99热| 蜜臀av性久久久久蜜臀aⅴ流畅| 毛片a片免费观看| 中文欧美在线视频| 久久久久高潮毛片免费全部播放| 亚洲综合婷婷久久| 欧美日韩国产中字| av片在线观看网站| 日韩精品久久一区二区三区|