精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧日韩免费视频| 97人人模人人爽人人少妇| 精品无人区无码乱码毛片国产| gay欧美网站| 国产欧美日韩在线看| 国产精品视频内| 青青草成人免费| 亚洲97av| 日韩一区二区三区观看| 91成人在线观看喷潮教学| 黄色在线小视频| 精品一区二区三区不卡| 欧美激情videoshd| 我和岳m愉情xxxⅹ视频| 精品视频91| 欧美性xxxx极品高清hd直播| 9999在线观看| 欧美成人综合在线| 国产精品一品视频| 国产成人免费91av在线| 欧美成人一二三区| 成人毛片免费看| 亚洲成人激情视频| 一道本在线免费视频| 国产高清视频色在线www| 国产精品成人午夜| 久久综合久久久| 国产成人久久精品77777综合 | 久久久91精品| 亚洲av无码一区二区三区网址| 亚洲天堂网站| 欧美在线免费观看视频| 日本少妇高潮喷水视频| 91麻豆免费在线视频| 国产日韩欧美在线一区| 久久精品五月婷婷| 国产香蕉在线观看| 国产久卡久卡久卡久卡视频精品| 国产精品成人一区二区| 日韩精品视频播放| 欧美性久久久| 乱亲女秽乱长久久久| 免费观看a级片| 国产欧美高清视频在线| 亚洲另类图片色| 欧美xxxx×黑人性爽| 伊人久久噜噜噜躁狠狠躁| 欧美日韩的一区二区| 亚洲一区二区三区四区五区xx| 神马午夜在线视频| 精品露脸国产偷人在视频| 日韩精品一区二区在线视频| 在线免费观看的av| 亚洲精品日日夜夜| 最新中文字幕久久| 国产亚洲欧美另类一区二区三区| 精品少妇人妻av一区二区三区| 亚洲视频自拍| 欧美高清视频一二三区 | 日本一区二区久久精品| 天堂国产一区二区三区| av中文字幕亚洲| 国语精品中文字幕| 婷婷av一区二区三区| 不卡av在线免费观看| 精品国产中文字幕| 婷婷开心激情网| 91亚洲国产成人精品一区二区三| 精品国产一区二区三区久久久久久 | 欧美做受xxxxxⅹ性视频| 亚洲欧洲色图| 在线电影欧美日韩一区二区私密| 18精品爽国产三级网站| 婷婷色综合网| 欧美高清视频在线播放| 日韩 欧美 中文| 日韩和欧美一区二区| 国产美女91呻吟求| 国产情侣一区二区| 成人免费av网站| 久久青青草原一区二区| 9i精品一二三区| 亚洲欧美另类小说视频| 丰满的少妇愉情hd高清果冻传媒 | 欧美人与禽猛交乱配视频| 欧美韩国理论所午夜片917电影| 欧美成人aaaaⅴ片在线看| 亚洲美女啪啪| 国产精品网红直播| 午夜精品久久久久久久爽| 99精品视频在线免费观看| 噜噜噜噜噜久久久久久91| www.av在线.com| 成人午夜电影久久影院| 美国av一区二区三区| 精品国产电影| 精品91久久久| 美女黄色成人网| 国产精品热视频| 国产精品视频无码| 成人黄色av网站在线| 免费在线成人av| 999在线视频| 久久精品视频在线看| 日韩中文在线字幕| 女人高潮被爽到呻吟在线观看| 在线观看视频一区二区欧美日韩 | 久久成人18免费观看| 亚洲综合在线小说| 色欲av永久无码精品无码蜜桃| 国产欧美精品区一区二区三区| 青少年xxxxx性开放hg| 蜜臀av在线| 色视频欧美一区二区三区| 成人不卡免费视频| 日韩欧美黄色| 久久视频中文字幕| 最新中文字幕一区| 国产suv精品一区二区883| 欧美日韩一区二区三区在线视频| 国产调教视频在线观看| 日韩欧美福利视频| 永久看看免费大片| 欧美限制电影| 97高清免费视频| 中文字幕一区二区三区四区欧美| 国产一区999| 欧美日韩一区在线播放 | 日本精品影院| 久久成人一区二区| 91在线视频在线观看| 国产乱码精品1区2区3区| 欧美日韩另类综合| 不卡专区在线| 日韩一区二区在线观看| 免费看黄色三级| 亚洲全部视频| 成人国产精品一区| 91电影在线播放| 欧美视频裸体精品| 涩视频在线观看| 国产精品国内免费一区二区三区| 国产99在线|中文| 丁香六月天婷婷| 国产精品超碰97尤物18| 久久婷婷五月综合色国产香蕉| 国产精品自在| 欧美另类暴力丝袜| 91午夜交换视频| av大片在线播放| 成人午夜免费视频| 偷拍盗摄高潮叫床对白清晰| 桃子视频成人app| 日韩福利在线播放| 日韩久久精品视频| 精品一区免费av| 色噜噜色狠狠狠狠狠综合色一| 香蕉伊大人中文在线观看| 日韩欧美精品在线| 国产传媒免费在线观看| 免费日本视频一区| 色之综合天天综合色天天棕色| a欧美人片人妖| 在线国产精品播放| 国产一级片免费视频| 久久久精品国产99久久精品芒果| 国产免费一区二区三区视频| 三级精品视频| 欧美一区二区.| 三级视频在线播放| 欧美亚洲一区三区| 香蕉久久久久久久| 久久 天天综合| 波多野结衣三级在线| 亚洲欧美久久精品| 美日韩在线视频| 国产精品人妻一区二区三区| 亚洲综合无码一区二区| 性猛交╳xxx乱大交| 亚洲国产影院| 麻豆精品蜜桃一区二区三区| 中文字幕资源网在线观看免费| 亚洲男人天天操| 欧美特级黄色片| 亚洲国产精品精华液ab| 亚洲欧美日本一区二区三区| 91精品91| 国产精品亚洲不卡a| 日本不卡网站| 国产一区二区黄| 中文字幕二区三区| 亚洲午夜久久久久中文字幕久| 又黄又爽的网站| 久久最新视频| 欧美日韩一区二区三区电影| 91成人精品在线| 2021久久精品国产99国产精品| 日本www在线观看视频| 日韩欧美不卡在线观看视频| 日韩成年人视频| 国产日韩欧美激情| 91视频福利网| 亚洲在线黄色| 日本在线观看一区二区| 精品视频一区二区三区在线观看| 亚州欧美日韩中文视频| jizz在线观看中文| 日韩你懂的在线播放| 毛片基地在线观看| 一区在线播放视频| 中文字幕在线视频播放| 看片网站欧美日韩| 欧美一级片免费播放| 欧美日韩有码| 国产经品一区二区| 成人精品一区二区三区电影| 久久99久久99精品中文字幕| av在线之家电影网站| 亚洲第一色中文字幕| 亚洲网站免费观看| 精品久久久久久久久久ntr影视| 手机av在线不卡| eeuss国产一区二区三区| 91国内在线播放| 久久中文在线| 久久在线中文字幕| 国产精品福利在线观看播放| 欧美亚洲精品日韩| 99精品中文字幕在线不卡| 国产成人精品av在线| 久久香蕉一区| 久久精品国产免费观看| 日韩av地址| 欧美精品一区二区三区一线天视频| 伊人网视频在线| 亚洲成人av资源| 久久精品久久国产| 亚洲女人小视频在线观看| 国产激情在线免费观看| 成人高清伦理免费影院在线观看| 97超碰人人爽| 香蕉亚洲视频| 欧美a在线视频| 亚洲国产高清一区| 久久av高潮av| 中文字幕免费一区二区三区| 色姑娘综合av| 色狠狠久久av综合| 六月婷婷久久| 香蕉久久精品日日躁夜夜躁| 国产一区二区视频在线免费观看| 亚洲大奶少妇| 99久久精品无码一区二区毛片| 日韩护士脚交太爽了| 国产精品狼人色视频一区| 成人午夜视屏| 国产精品久久久久久久久久新婚| 永久免费毛片在线播放| 69国产精品成人在线播放| 678在线观看视频| 久久久在线视频| 麻豆网站在线观看| 欧美理论片在线观看| 污的网站在线观看| 久久99青青精品免费观看| 日韩少妇视频| 久久久久久久久电影| 美女扒开腿让男人桶爽久久软| 韩日精品中文字幕| 日韩伦理福利| 欧美最猛性xxxxx(亚洲精品)| 亚洲欧洲日本韩国| 国产成人精品电影久久久| 涩涩在线视频| 国产精品高潮呻吟视频| 欧美色网一区| 国产精品av在线| 国产一区二区三区黄网站| 不卡视频一区二区| 果冻天美麻豆一区二区国产| 国模精品一区二区三区| 国产一区丝袜| 亚洲国产精品一区在线观看不卡| 91日韩在线| 国产又粗又猛又爽又黄的网站 | 中文字幕不卡每日更新1区2区| 国产一区二区欧美| 亚洲五月六月| 欧美视频在线观看| 午夜精品久久久久久久无码| 丝袜美腿成人在线| 无套白嫩进入乌克兰美女| 成人免费高清视频在线观看| 成年人网站免费看| 中文字幕在线播放不卡一区| 国产亚洲欧美久久久久| 91精品福利视频| 一道本无吗一区| 欧美成人r级一区二区三区| 日本私人网站在线观看| 在线亚洲午夜片av大片| 国产在线1区| 国产成人精品在线| 精品中文字幕一区二区三区四区| 国产一区自拍视频| 精品福利久久久| 17c丨国产丨精品视频| 日韩中文字幕麻豆| 亚洲黄色片免费看| 91在线国内视频| 国产色无码精品视频国产| 色综合天天综合色综合av| 99热这里只有精品在线观看| 亚洲老头同性xxxxx| 在线观看三级视频| 国产精品成久久久久三级| 美女网站色精品尤物极品姐弟| 亚洲精品影院| 夜夜爽www精品| 久久精品30| 中文字幕亚洲日本| 国产欧美一区二区精品久导航| 青青草原在线免费观看视频| 欧美图区在线视频| 五月激情婷婷网| 久久久久久久久久久免费精品| 国产精品第一国产精品| 精品一卡二卡三卡四卡日本乱码 | 亚洲国产一区在线| 国产精品久久久久久久免费软件 | 人妻人人澡人人添人人爽| 欧美性xxxxxx少妇| 手机福利小视频在线播放| 欧美另类交人妖| 亚洲男人在线| 日韩av高清| 日韩电影在线免费观看| 欧亚乱熟女一区二区在线| 一区二区三区四区视频精品免费 | 亚洲国产国产| 精品国产一区二区三区在线| 麻豆精品一二三| 男人舔女人下部高潮全视频| 精品久久久久久| 刘亦菲久久免费一区二区| 欧美黑人巨大xxx极品| 96视频在线观看欧美| 亚洲午夜精品久久久中文影院av| 免费日韩av片| 最近中文字幕无免费| 亚洲成人手机在线| 亚洲精品视频网| 久久中文字幕在线视频| 国内自拍亚洲| 亚洲欧美日韩不卡| 极品美女销魂一区二区三区免费| 91资源在线播放| 欧美日韩一区二区三区高清| 最近高清中文在线字幕在线观看| 国产成人精品久久久| 中文字幕精品影院| 国产成人精品无码播放| 国产欧美一区二区在线观看| 国产精品无码粉嫩小泬| 夜夜嗨av一区二区三区四区 | 在线观看黄av| 国产中文日韩欧美| 国产精品99免费看| 无码人妻一区二区三区精品视频| 亚洲精品视频在线观看网站| 亚洲美女福利视频| 日本成熟性欧美| 国产亚洲一区| www.亚洲高清| 亚洲婷婷国产精品电影人久久| 高潮一区二区三区乱码| 欧美激情精品久久久久| 久久国产精品色av免费看| 久在线观看视频| 9久草视频在线视频精品| 亚洲中文一区二区| 日韩中文视频免费在线观看| 国产精品视频一区视频二区| 日本a级片在线观看| 99久久精品国产网站| 日韩综合在线观看| 深夜福利国产精品| 亚洲性视频在线| 99在线精品免费视频| 久久久久久麻豆| 国产又色又爽又黄又免费| 欧美大片第1页| 国产一区99| 日本女人性视频| 欧美午夜丰满在线18影院| 9i精品一二三区| 久久国产主播精品| 美女视频网站久久| 国产乡下妇女做爰视频| 国产亚洲精品va在线观看|