Ktor with Kmongo and kotlinx.serialization

1.3k Views Asked by At

I have a setup where I use KTor with KMongo and Kotlinx.Serialization.

The Kmongo part works, I can get and put my Class

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

Into the database and retrieve it. That all works flawlessly.

But when I try to send that object through a rest call to the frontend, again with 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")
        }
    }

It throws this expection:

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)

Now I figured out that this is because there are 2 instances of the kotlin.serialization json. and the one on KMongo does not share it's serializers with the other one.

so I added the serializers from KMongo to the other instance from Ktor

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

and now I get

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')

So my question is why is it happening and how to fix it?

1

There are 1 best solutions below

0
On BEST ANSWER

Edit: This issue has been fixed.

I also posted this question on the KMongo github and basically got an instant response that this was fixed for Jackson but not yet for Kotlinx.serialization.

Someone is going to fix this.

Edit: It has been fixed