如何避免open-api-generator生成的Kotlin字段为可空类型?
OpenAPI Generator生成Kotlin数据类所有字段可空的原因分析
问题场景
使用OpenAPI Generator生成Kotlin Retrofit2客户端时,所有数据类字段都被生成为可空类型,示例如下:
data class PagedResultDtoOfStoredDeviceFilterWithoutTermDto ( @Json(name = "currentPage") val currentPage: kotlin.Int? = null, @Json(name = "totalPages") val totalPages: kotlin.Int? = null, @Json(name = "pageSize") val pageSize: kotlin.Int? = null, @Json(name = "totalCount") val totalCount: kotlin.Int? = null, @Json(name = "items") val items: kotlin.collections.List<StoredDeviceFilterWithoutTermDto>? = null )
生成使用的配置命令:
java -jar open-api-generator-cli.jar generate ^ -g kotlin ^ --library jvm-retrofit2 ^ -i "https://app-hsm-clse-stage.azurewebsites.net/swagger/standardV1/swagger.json" ^ -p groupId=com.mycompany ^ -p artifactId=mycompany-myproduct-client-kotlin ^ -p artifactVersion=1.0.0 ^ -p basePackage=com.mycompany.myproduct.networking ^ -p packageName=com.mycompany.myproduct.networking ^ -p configPackage=com.mycompany.myproduct.networking.config ^ -p apiPackage=com.mycompany.myproduct.networking.api ^ -p modelPackage=com.mycompany.myproduct.networking.model ^ -p sourceFolder=src/main/java ^ -p dateLibrary=java8 ^ -p java8=true ^ -p useRxJava3=true
尽管服务端实际返回的诸多字段并非可空,但生成的代码不符合需求,以下是核心原因分析:
核心原因
1. OpenAPI规范未标记字段为必填
OpenAPI Generator完全依赖提供的Swagger/OpenAPI规范生成代码。如果规范中对应的PagedResultDtoOfStoredDeviceFilterWithoutTermDto schema没有通过required数组明确指定哪些字段是服务端必须返回的,生成器会默认认为所有字段都是可选的,因此生成为可空类型。
比如规范中如果没有类似以下的定义:
"PagedResultDtoOfStoredDeviceFilterWithoutTermDto": { "type": "object", "required": ["currentPage", "totalPages", "pageSize", "totalCount", "items"], "properties": { // ... 字段定义 } }
生成器就无法判断哪些字段是必须存在的,只能保守地将所有字段设为可空。
2. Kotlin生成器的默认行为
针对jvm-retrofit2库的Kotlin生成器,默认行为是将所有非required标记的字段设为可空类型,并赋予null默认值。这是为了兼容服务端可能出现的字段缺失场景,避免反序列化时出现异常。即使服务端实际不会返回null,只要规范没声明必填,生成器就会按可选字段处理。
3. 未配置控制可空性的生成参数
你的生成命令中缺少控制字段可空性的参数。OpenAPI Generator的Kotlin生成器提供了requiredPropertiesAsNonNull参数,默认值为false。如果不将其设为true,即使规范中标记了required的字段,也会被生成为可空类型。
验证与解决方向
- 检查并修正OpenAPI规范:确认目标schema中是否包含
required数组,将服务端保证返回的字段加入其中。 - 添加生成参数:在生成命令中追加
-p requiredPropertiesAsNonNull=true,让生成器将规范中标记为required的字段生成为非空类型。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

