Swagger生成Ktor类未导入kotlinx.serialization.Serializable报错如何解决
修复openapi-generator生成Kotlin类缺失@Serializable注解问题
最优解决方案:修改生成器配置自动注入注解
无需手动修改生成后的代码,一次配置永久生效:
- 打开你的openapi-generator配置(Gradle/Maven插件配置、CLI命令参数均可)
- 针对Kotlin生成器添加
serializationLibrary配置项,值设为kotlinx_serialization
Gradle Kts配置示例:
CLI命令示例:openapiGenerate { generatorName.set("kotlin-server") // 生成客户端则填kotlin configOptions.set(mapOf( "serializationLibrary" to "kotlinx_serialization", "packageName" to "com.your.project" // 保留原有其他配置 )) }openapi-generator generate -i openapi.yaml -g kotlin-server -o ./generated \ --additional-properties serializationLibrary=kotlinx_serialization - 重新执行代码生成命令,新生成的所有Model类都会自动导入
kotlinx.serialization.Serializable并添加类注解,报错即可解决
临时调试方案:手动注册外部序列化器
如果不方便修改生成配置,可通过外部序列化器适配,不需要改动生成代码:
import kotlinx.serialization.* import kotlinx.serialization.descriptors.* import kotlinx.serialization.encoding.* import com.your.project.generated.model.SomeRequest // 声明和生成类字段完全一致的代理类 @Serializable private class SomeRequestSurrogate( val id: Long, val content: String // 补齐所有和SomeRequest对应的字段 ) // 实现外部序列化器 object SomeRequestSerializer : KSerializer<SomeRequest> { override val descriptor: SerialDescriptor = SomeRequestSurrogate.serializer().descriptor override fun serialize(encoder: Encoder, value: SomeRequest) { val surrogate = SomeRequestSurrogate(value.id, value.content) encoder.encodeSerializableValue(SomeRequestSurrogate.serializer(), surrogate) } override fun deserialize(decoder: Decoder): SomeRequest { val surrogate = decoder.decodeSerializableValue(SomeRequestSurrogate.serializer()) return SomeRequest(surrogate.id, surrogate.content) } }
完成后在Ktor内容协商配置中注册该序列化器即可生效。
前置校验
确保项目已开启Kotlin序列化插件并引入对应依赖:
// 根目录build.gradle.kts配置 plugins { kotlin("jvm") version "1.9.0" apply false kotlin("plugin.serialization") version "1.9.0" apply false } // 业务模块build.gradle.kts配置 dependencies { implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.3") }
内容的提问来源于stack exchange,提问作者rgaponov
相关产品推荐
相关产品推荐

