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

Jackson module-kotlin:JsonInclude(NON_EMPTY)下类反序列化失败解决方案咨询

解决方案

1. 全局配置Jackson自动填充空集合

你用的jackson-module-kotlin自带了适配Kotlin集合的特性,开启NullToEmptyCollection后,Jackson会在反序列化时自动把缺失的非空集合类型(List、Set等)替换为空集合,完全不用修改生成的模型。

配置代码示例:

import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.KotlinFeature
import com.fasterxml.jackson.databind.ObjectMapper

val objectMapper = ObjectMapper()
    .registerModule(
        KotlinModule.Builder()
            // 开启缺失集合自动转为空集合
            .configure(KotlinFeature.NullToEmptyCollection, true)
            // 若有需要,可同时开启Map的空值处理
            // .configure(KotlinFeature.NullToEmptyMap, true)
            .build()
    )

在Ktor客户端中集成该配置:

val client = HttpClient(OkHttp) {
    install(ContentNegotiation) {
        jackson {
            registerModule(
                KotlinModule.Builder()
                    .configure(KotlinFeature.NullToEmptyCollection, true)
                    .build()
            )
        }
    }
}

这个配置刚好适配你的场景:API响应因NON_EMPTY省略空集合,反序列化时缺失的List字段会自动用listOf()填充,不会再触发非空字段的报错。

2. 临时修复生成的模型(若允许少量修改)

如果全局配置不符合需求,可针对生成的模型做局部调整:

  • 手动补默认值:针对有问题的字段,生成后手动追加默认值,比如:
    data class Foo (
        @field:JsonProperty("version") val version: kotlin.Int,
        @field:JsonProperty("bar") val bar: kotlin.collections.List<FooBar> = listOf(),   
        ...
    )
    
    缺点是每次重新生成模型都要重复操作,适合临时测试场景。
  • 自定义OpenAPI生成模板:修改Kotlin生成器的dataClass.mustache模板,调整属性默认值的处理逻辑,确保allOf继承的属性也能读取OAS中的default值并生成对应代码。

3. 修复OpenAPI Generator本身的问题

你遇到的是openapi-generator-maven-plugin 7.5.0版本的已知bug——allOf继承时默认值生成逻辑失效。可以尝试:

  • 升级插件版本:更新pom.xml中的插件版本到8.x及以上,新版本大概率修复了该问题。
  • 提交Bug报告:到OpenAPI Generator的官方仓库提交issue,附上你的OAS示例和生成的模型代码,帮助官方定位修复。

内容的提问来源于stack exchange,提问作者Tomas F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:34:49