Ktor 与 Kmongo 和 kotlinx.serialization

Posted

技术标签:

【中文标题】Ktor 与 Kmongo 和 kotlinx.serialization【英文标题】:Ktor with Kmongo and kotlinx.serialization 【发布时间】:2020-11-13 03:47:22 【问题描述】:

我有一个设置,我将 KTor 与 KMongo 和 Kotlinx.Serialization 一起使用。

Kmongo 部分有效,我可以获取并放置我的类

@Serializable
data class Task(@ContextualSerialization @SerialName("_id") val _id : Id<Task> = newId(),
                val title : String = "",
                val description : String = ""
)

进入数据库并检索它。这一切都完美无缺。

但是当我尝试通过休息调用将对象发送到前端时,再次使用 Kotlinx.Serialization。

get<Tasks> task ->
        val dao by di().instance<Dao>();
        val task = Task( title = "task1", description = "task1description");
        val foundTask = dao.read(task);
        if(foundTask != null)
            call.respond(foundTask)
         else 
            call.respond("didn't find anything")
        
    

它抛出了这个期望:

kotlinx.serialization.SerializationException: Can't locate argument-less serializer for class WrappedObjectId. For generic classes, such as lists, please provide serializer explicitly.
    at kotlinx.serialization.PlatformUtilsKt.serializer(PlatformUtils.kt:21)
    at kotlinx.serialization.modules.SerialModuleExtensionsKt.getContextualOrDefault(SerialModuleExtensions.kt:29)
    at kotlinx.serialization.ContextSerializer.serialize(ContextSerializer.kt:29)
    at kotlinx.serialization.json.internal.StreamingJsonOutput.encodeSerializableValue(StreamingJsonOutput.kt:227)
    at kotlinx.serialization.builtins.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:72)

现在我发现这是因为 kotlin.serialization json 有 2 个实例。并且 KMongo 上的一个不与另一个共享它的序列化程序。

所以我将 KMongo 中的序列化程序添加到 Ktor 中的另一个实例中

install(ContentNegotiation) 
        json(
            json = Json(DefaultJsonConfiguration.copy(prettyPrint = true), context = kmongoSerializationModule),
            contentType = ContentType.Application.Json
        )
    

现在我明白了

java.lang.ClassCastException: class kotlinx.serialization.json.internal.StreamingJsonOutput cannot be cast to class com.github.jershell.kbson.BsonEncoder (kotlinx.serialization.json.internal.StreamingJsonOutput and com.github.jershell.kbson.BsonEncoder are in unnamed module of loader 'app')

所以我的问题是它为什么会发生以及如何解决它?

【问题讨论】:

【参考方案1】:

编辑:此问题已修复。

我还在 KMongo github 上发布了这个问题,基本上得到了即时回复,说这已为 Jackson 修复,但尚未针对 Kotlinx.serialization。

有人会解决这个问题。

编辑:已修复

【讨论】:

以上是关于Ktor 与 Kmongo 和 kotlinx.serialization的主要内容,如果未能解决你的问题,请参考以下文章

异常打开套接字 kmongo 和 ktor

MongoDB 数据库不是在 Kotlin(Ktor) 中创建的

Ktor Websocket 功能与 ktor 中的 ContentNeogation 功能 (JSON / GSON)

Ktor 和远程 tomcat 部署

Ktor 与 Spring Boot WebFlux web api

将 JWT 与 Ktor 一起使用并在声明中包含用户信息