You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免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的字段,也会被生成为可空类型。

验证与解决方向

  1. 检查并修正OpenAPI规范:确认目标schema中是否包含required数组,将服务端保证返回的字段加入其中。
  2. 添加生成参数:在生成命令中追加-p requiredPropertiesAsNonNull=true,让生成器将规范中标记为required的字段生成为非空类型。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:53:14