Swagger Gen 2.2如何避免重复生成相同Java类实现跨包复用
假设存在如下YAML定义文件:
- Article.yml
GenericArticleDto: type: object properties: description: type: string [...]
- Order.yml
EnglishArticleDto: type: object allOf: - $ref: '../Article.yml/components/schemas/GenericArticleDto' [...]
首次使用swagger gen基于Order.yml生成Java类,指定目标生成包为com.test.order,生成完成后该包下包含EnglishArticleDto.java、GenericArticleDto.java两个类文件。
后续存在另一份同样引用GenericArticleDto对象的YAML文件Proposal.yml:
- Proposal.yml
CustomerArticleDto: type: object allOf: - $ref: '../Article.yml/components/schemas/GenericArticleDto'
若再次使用swagger gen基于Proposal.yml生成Java类,指定目标生成包为com.test.proposal,执行生成脚本后该包下会生成CustomerArticleDto.java、GenericArticleDto.java两个类文件,产生重复的GenericArticleDto类定义。
当前使用的swagger gen版本为2.2,是否支持通过相关配置,避免重复生成GenericArticleDto类,直接复用com.test.order包下已存在的GenericArticleDto类?
Swagger Codegen 2.2原生支持该能力,通过importMappings配置即可实现复用已有类、避免重复生成,不需要修改原有YAML文件的引用规则。
配置逻辑为:将需要复用的模型名称和目标已有类的全限定名做显式映射,生成器识别到映射规则后,遇到对应模型的$ref引用时,不会重新生成类文件,只会在生成的代码中直接导入指定路径下的已有类。
针对本场景,生成Proposal.yml对应代码时添加如下映射规则即可:GenericArticleDto=com.test.order.GenericArticleDto
不同执行方式的配置写法:
- Maven插件方式:在插件configuration节点下添加importMappings配置
<configuration> <inputSpec>src/main/resources/Proposal.yml</inputSpec> <apiPackage>com.test.proposal.api</apiPackage> <modelPackage>com.test.proposal.model</modelPackage> <importMappings> <importMapping>GenericArticleDto=com.test.order.GenericArticleDto</importMapping> </importMappings> </configuration>
- CLI命令行方式:执行生成命令时追加
--import-mappings参数,参数值按模型名=全限定类名格式填写,多个映射用逗号分隔。
如果后续有更多跨模块复用的公共模型,统一将对应映射规则加到importMappings配置中即可。
注意:该配置仅做引用映射,不会校验目标类是否真实存在,需要保证配置的全限定类名和实际已有类路径一致,避免出现编译报错。
内容的提问来源于stack exchange,提问作者davide.ferrari

