You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

openapi-generator-maven-plugin能否在一个模块中使用多个responseWrapper类?

解决openapi-generator-maven-plugin响应包装类差异化配置问题

要实现部分接口用ResponseEntity、部分用自定义SomeReturnType的生成效果,有以下几种可行方案:

方案一:利用OpenAPI扩展字段+自定义模板(推荐)

通过给特定接口添加OpenAPI扩展字段,结合修改生成模板实现差异化响应包装:

  1. 在OpenAPI规范中标记需要自定义包装的接口
    在接口定义里添加x-response-wrapper扩展字段,指定该接口使用的响应包装类,未添加的接口默认使用ResponseEntity:
paths:
  /download:
    get:
      summary: 文件下载接口
      responses:
        '200':
          description: 下载成功
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary
  /upload:
    post:
      summary: 文件上传接口
      x-response-wrapper: "us.myorg.SomeReturnType" # 指定自定义包装类
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
                entity:
                  type: string
      responses:
        '200':
          description: 上传成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SomeClass'
  1. 复制并修改生成模板
  • 从openapi-generator的Spring模板库中复制api.mustache文件,放到项目的src/main/resources/templates目录。
  • 修改模板中响应类型的生成逻辑,替换全局responseWrapper的判断:
{{#returnType}}
{{#x-response-wrapper}}{{x-response-wrapper}}{{/x-response-wrapper}}{{^x-response-wrapper}}ResponseEntity{{/x-response-wrapper}}<{{returnType}}> {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, {{/hasMore}}{{/allParams}}){{#throws}} throws {{throws}}{{/throws}};
{{/returnType}}
  1. 配置maven插件使用自定义模板
    在插件配置中指定模板目录:
<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>6.6.0</version> <!-- 使用最新稳定版本 -->
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec>
                <generatorName>spring</generatorName>
                <templateDirectory>${project.basedir}/src/main/resources/templates</templateDirectory>
                <!-- 其他必要配置(如包名、生成目录等) -->
            </configuration>
        </execution>
    </executions>
</plugin>

方案二:分两次生成后合并接口

如果不想修改模板,可以分两次生成接口再合并:

  • 第一次生成:不配置responseWrapper,生成包含download接口的临时文件。
  • 第二次生成:配置<responseWrapper>us.myorg.SomeReturnType</responseWrapper>,生成包含upload接口的临时文件。
  • 将两个临时文件中的接口方法合并到最终的MyInterface中。
    此方法适合接口数量较少的场景,缺点是无法自动化维护。

方案三:生成后手动调整(不推荐)

生成接口后手动修改响应包装类,将download方法的SomeReturnType替换为ResponseEntity。但这种方式每次生成代码都需要重复修改,无法持续集成。

内容的提问来源于stack exchange,提问作者Rinat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:20:12