如何在Android Kotlin项目的OpenAPI Generator中忽略无指定类型的字段生成
嘿,我之前也踩过这个坑!用OpenAPI Generator结合kotlinx.serialization生成模型时,碰到additionalProperties: true的字段会生成kotlin.Any?类型的属性,后续序列化时直接报错。用Mustache模板修改确实是解决办法,我来一步步给你说怎么操作:
第一步:导出默认模板到本地
如果你是用Gradle插件调用OpenAPI Generator的话,可以先把官方的Kotlinx Serialization模板导出到项目里,方便修改。执行这条Gradle命令:./gradlew openApiGenerate --export-template-dir src/main/resources/openapi-templates导出后,在
src/main/resources/openapi-templates里找到kotlinx-serialization/model.mustache文件,这就是控制数据类生成的核心模板。第二步:修改模板,排除additionalProperties字段
打开model.mustache,找到遍历生成属性的那段代码(大概是模板里处理vars的部分),原来的代码会生成所有属性,我们要加个判断,跳过那些属于additionalProperties的字段。把原来的属性生成块改成这样:
{{#vars}} {{^isAdditionalProperties}} {{#isNullable}}@Optional{{/isNullable}} @SerialName("{{name}}") val {{fieldName}}: {{datatype}}{{#isNullable}}?{{/isNullable}} = {{defaultValue}}, {{/isAdditionalProperties}} {{/vars}}这里的
{{^isAdditionalProperties}}是反向判断,意思是只有当该属性不是additionalProperties时才生成代码,完美跳过你说的delivery_data这类字段。注意:有些版本的OpenAPI Generator里,判断变量可能是
additionalProperties而不是isAdditionalProperties,如果上面的写法没生效,可以换成{{^additionalProperties}}试试。第三步:配置Generator使用自定义模板
回到你的Gradle配置,在openApiGenerate任务里指定模板目录,让Generator用你修改后的模板生成代码:openApiGenerate { generatorName = "kotlin" library = "kotlinx-serialization" inputSpec = "$rootDir/src/main/resources/swagger.yaml".toString() outputDir = "$buildDir/generated/openapi".toString() // 指定自定义模板的目录 templateDir = "$rootDir/src/main/resources/openapi-templates/kotlinx-serialization" // 其他你需要的配置... }
做完这些,重新执行生成任务,那些麻烦的kotlin.Any?类型字段就不会出现在你的模型里了,序列化报错的问题也能解决~
内容来源于stack exchange

