OpenAPI Generator 工具的躺坑尝试

本文介绍了如何利用OpenAPIGenerator进行API定义和代码生成,以提高开发效率。作者分享了从SwaggerHub导出YAML文件,通过Gradle插件管理SpringBoot项目,以及在独立模块中组织生成代码的步骤。尽管工具存在冗余和理解难度,但建议仅用于生成Models和API接口,以简化代码并提升灵活性。项目源码和参考资料链接已提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

讲道理,这个工具覆盖的语言比较全,But 不是很好用的工具,里面包含的坑还是很多。从GitHub上的就可以看出,Star 7.8k,而issuer就已经提了2k个,慎用……

如果你希望使用的Swagger 2.0 版本的 OpenAPI的 V2版本,那么使用Swagger-Codegen是可以很好的满足自己的需求的;

OpenAPI Generator 是从Swagger-codegen中专门切分出来,用来满足快速开发的OpenAPI V3的版本。

Overview

这个项目的代码,是我基于这两天的学习整理出来的,主要是想通过 Swagger UI的界面,采用最新的 OpenAPi V3 的语法风格来生成相关的 yaml 文件,通过该yaml文件能够借助 OpenAPI Generator 的相关工具来自动的生成代码。

使用这个插件开发的相关思路说明:(帮助你提前避坑)

  1. 通过SwaggerHub 的Web界面,来定义好相关的API,编写好之后导出成yml格式文件;
  2. 引入OpenAPI 的Gradle插件来管理SpringBoot的项目;
  3. 尽量单独的起一个子模块来完全的存储OpenAPI Generator 产生的所有代码
  4. 实际的业务逻辑代码,可以在其它独立的模块中编写,并引入OpenAPI Generator生成的模块。

在使用这个工具的实际过程中,随着编写的加深,会感觉到自动生成的代码,非常的冗余且不好理解。这里个人建议,**只使用 OpenAPI Generator 工具生成最简单的模块(Models)和APi的接口。**好处不言而喻,在减少重复编写的代码的同时,能够极大的提升代码的灵活性。

项目地址

https://gitee.com/ilovestudy1314/spring-boot-guide 中的 swagger-codegen 分支

资料参考


  1. 官方的Github项目地址。 OpenAPI Generator
  2. OpenAPI接口的规范定义文档 OpenAPI-Spec
  3. OpenAPI同SpringBoot继承的项目是 springfox
  4. 生成器中,专门对于Spring环境下的配置说明 Generators - Spring - ConfigurationOption
<think>我们正在处理一个关于OpenAPI生成文件时只创建了inner文件的问题。根据用户提供的引用信息,特别是引用[3]和[4],我们可以推测这个问题可能与Android开发中的混淆配置或编译设置有关。 引用[3]提到了一条警告:“Dx warning: Ignoring InnerClasses attribute for an anonymous inner class”,并且展示了一个ProGuard规则,该规则试图保留一个实现了特定接口的类。引用[4]则展示了一个错误信息,提示“indicate that it is *not* an inner class”,并给出了相关的编译设置(compileSdkVersion 24等)。 结合这些信息,我们可以推断,用户在使用OpenAPI生成代码时,可能遇到了以下情况: 1. 生成的代码中包含了内部类(inner class)或匿名内部类(anonymous inner class)。 2. 在编译过程中,由于混淆配置或编译器的处理,这些内部类的属性被忽略,导致只生成了内部类文件(可能是预期的,也可能不是预期的),或者出现了错误。 可能的原因及解决方法: **原因1:混淆配置问题** 在ProGuard配置中,如果内部类没有被正确保留,可能会导致编译器忽略内部类的属性,从而只生成内部类文件(或者导致内部类文件被错误处理)。引用[3]中的ProGuard规则试图保留一个内部类,但规则可能不够完善。 **解决方法:** 检查并修改ProGuard规则,确保正确保留内部类。例如,可以尝试使用以下规则: ```proguard -keep class com.tencent.mm.sdk.openapi.** { *; } -keep class * implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject { *; } ``` 这样会保留整个包以及实现指定接口的所有类(包括内部类)。 **原因2:编译设置或依赖问题** 引用[4]中提到了一个错误,并且给出了编译设置(使用较旧的SDK版本24)。这可能是由于依赖库与编译SDK版本不兼容导致的。 **解决方法:** 更新编译SDK版本和依赖库版本。例如,将编译设置更新为较新的版本: ```gradle compileSdkVersion 30 buildToolsVersion "30.0.3" targetSdkVersion 30 implementation 'com.android.support:appcompat-v7:28.0.0' // 或者使用AndroidX ``` 同时,确保使用的OpenAPI库与编译环境兼容。 **原因3:OpenAPI生成代码的配置问题** OpenAPI生成代码时,可能由于配置问题导致只生成了内部类文件。例如,生成器可能被配置为只生成内部类,或者生成过程中出现了错误。 **解决方法:** 检查OpenAPI的生成配置,确保正确设置了生成选项。如果是使用Swagger Codegen等工具,检查是否指定了正确的模型和API生成选项。例如,检查是否有不正确的配置导致只生成内部类。 **原因4:代码生成器本身的限制或bug** 某些代码生成器在生成代码时,对于嵌套类(内部类)的处理可能存在问题,导致只生成了内部类文件。 **解决方法:** 升级代码生成器到最新版本,查看是否有相关bug的修复。或者,调整API定义文件(如OpenAPI/Swagger文件),避免使用内部类结构,将内部类提升为顶级类。 **总结步骤:** 1. 检查混淆配置(ProGuard规则),确保内部类被正确保留。 2. 更新编译环境(SDK版本、依赖库版本)到较新的稳定版本。 3. 检查OpenAPI生成配置,确保生成选项正确。 4. 升级代码生成器版本,或修改API定义文件以避免内部类。 如果以上步骤不能解决问题,可能需要查看具体的错误日志和生成的文件结构,以进一步定位问题。 相关问题: 1. 如何正确配置ProGuard以保留内部类? 2. 在Android开发中,如何解决因SDK版本过旧导致的兼容性问题? 3. 使用OpenAPI生成代码时,如何避免生成内部类? 4. 如何更新OpenAPI生成器(如Swagger Codegen)到最新版本?</think>### OpenAPI 生成文件时只创建 inner 文件的原因及解决方法 #### 原因分析 1. **混淆配置问题** 当 ProGuard/R8 混淆工具错误处理内部类时,会导致生成的文件被标记为 `inner` 类型。引用[3]中的警告 `Dx warning: Ignoring InnerClasses attribute for an anonymous inner class` 表明混淆工具未能正确处理内部类的元数据[^3]。 2. **SDK 版本冲突** 如引用[4]所示,使用较旧的 SDK 版本(如 `compileSdkVersion 24`)可能导致内部类识别错误。新版本 OpenAPI 库可能依赖更高版本的 SDK 特性[^4]。 3. **接口实现不规范** OpenAPI 生成器对实现了特定接口(如 `WXMediaMessage$IMediaObject`)的类处理严格。若实现类未正确定义为静态内部类或顶级类,会被强制标记为 `inner`[^3]。 4. **字节码处理错误** Android 的 DEX 编译器(DX)在处理匿名内部类时,可能因元数据缺失错误地将文件归类为 `inner` 类型[^3]。 --- #### 解决方法 1. **更新 Gradle 配置** 升级 SDK 和依赖库版本以修复兼容性问题: ```gradle android { compileSdkVersion 33 // 至少升级到 30+ buildToolsVersion "30.0.3" dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' // 或 AndroidX } } ``` 2. **修正混淆规则** 在 `proguard-rules.pro` 中添加显式保留规则: ```proguard -keep class com.yourpackage.** { *; } // 保留所有自定义类 -keep class * implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject { public <methods>; // 保留接口实现类 } ``` 3. **重构类定义** 将内部类改为静态嵌套类(若逻辑允许): ```java // 修改前(非静态内部类) public class Outer { public class Inner {} // 隐含持有 Outer 引用 } // 修改后(静态内部类) public class Outer { public static class Inner {} // 无隐含引用 } ``` 4. **检查 OpenAPI 生成配置** 确认生成器参数未强制使用内部类模式: ```bash openapi-generator generate -i spec.yaml -g java \ --additional-properties=library=retrofit2 \ --model-package=com.example.models # 明确指定模型包路径 ``` --- #### 验证步骤 1. 清理构建缓存: ```bash ./gradlew cleanBuildCache ``` 2. 检查生成的 `.class` 文件: ```bash javap -v YourClass.class | grep "inner class" # 正常应无 "inner class" 标记 ``` 3. 运行测试用例验证接口调用是否正常。 > **关键提示**:若问题仍存在,检查 OpenAPI 规范文件(YAML/JSON)中是否包含嵌套 `schema` 定义。层级过深的嵌套结构易触发生成器内部类逻辑,建议通过 `$ref` 拆分模型[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值