Ктор с Kmongo и kotlinx.serialization

У меня есть установка, в которой я использую KTor с KMongo и Kotlinx.Serialization.

Часть Kmongo работает, я могу получить и поставить свой класс

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

В базу данных и получить ее. Все это работает безупречно.

Но когда я пытаюсь отправить этот объект через вызов rest на интерфейс, снова с помощью 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)

Теперь я понял, что это потому, что существует 2 экземпляра json kotlin.serialization. и тот, что на 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')

Итак, мой вопрос: почему это происходит и как это исправить?


person moortuvivens    schedule 23.07.2020    source источник


Ответы (1)


Изменить: эта проблема исправлена.

Я также разместил этот вопрос на github KMongo и в основном получил мгновенный ответ, что это было исправлено для Джексона, но еще не для сериализации Kotlinx.

Кто-то собирается это исправить.

Изменить: это было исправлено

person moortuvivens    schedule 24.07.2020