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.
相关产品推荐
相关产品推荐

