Kotlin Spring Boot(Gradle)中OpenAPI Generator重复生成模型问题
解决OpenAPI Generator重复生成跨模块模型的问题
核心思路
要让app模块的OpenAPI生成器直接复用shared模块的已有模型,关键是精准配置模型排除+正确映射导入,之前的问题大概率是配置项的格式或参数匹配错误。
具体解决方案
1. 修正importMappings配置
之前用importMappings未生效,可能是映射的类名或包路径不匹配。需确保映射的是shared模块中已生成模型的完整类路径,同时配合typeMappings让生成器识别并复用已有类。
Kotlin DSL配置示例:
openApiGenerate { generatorName.set("kotlin-spring") inputSpec.set("$rootDir/src/main/resources/openapi/app.yaml") outputDir.set("$buildDir/generated/openapi") packageName.set("com.example.app") // 格式:OpenAPI Schema名称 = shared模块中模型的完整类路径 importMappings.set(mapOf( "Widget" to "com.example.shared.model.Widget", "UserProfile" to "com.example.shared.model.UserProfile" // 按需添加所有需复用的模型 )) // 配合typeMappings,确保生成代码时使用导入而非重复生成类 typeMappings.set(mapOf( "Widget" to "Widget", "UserProfile" to "UserProfile" )) }
2. 彻底排除指定模型生成
如果某些模型完全不需要在app模块生成,使用excludeModels参数比modelsToGenerate更直接,适合排除跨模块重复的模型。
示例:
openApiGenerate { // 其他基础配置... // 排除shared模块已有的模型,多个模型用逗号分隔 excludeModels.set("Widget,UserProfile") }
3. 确保跨模块依赖配置正确
在app模块的build.gradle.kts中添加shared模块的依赖,让生成的代码能正确引用到已有模型:
dependencies { implementation(project(":shared")) // 其他项目依赖... }
4. 检查OpenAPI YAML的引用格式
确保app.yaml中引用shared.yaml的Schema时,使用标准的跨文件$ref格式,避免生成器把外部Schema当成本地Schema处理:
# app.yaml中的示例引用 components: schemas: Order: type: object properties: widget: $ref: '../shared.yaml#/components/schemas/Widget' # 对应shared.yaml的正确路径
常见问题排查
importMappings仍生成新类:检查映射的Schema名称是否和OpenAPI定义的大小写完全一致,以及shared模块的模型是否确实存在于指定包路径。excludeModels不生效:确认使用的OpenAPI Generator版本为v5.0+,低版本不支持该参数,建议升级插件。- 生成代码报错:清理
build/generated目录后重新执行openApiGenerate任务,避免缓存干扰。
内容的提问来源于stack exchange,提问作者Shubham Sah
相关产品推荐
相关产品推荐

