El serializador de Ktor para la clase ‘Response’ no se encuentra.
Plugin y dependencia:
id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
implementation "io.ktor:ktor-serialization:$ktor_version"
Archivo Application
:
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
install(ContentNegotiation) {
json()
}
userRouter()
}.start(wait = true)
}
UserRouter
:
fun Application.userRouter() {
routing {
get("/users/{id}") {
val id = call.parameters["id"]?.toInt() ?: -1
val user = User("Sam", "sam@gmail.com", "abc123")
val response = if (id == 1) {
Response("hahaha", false)
} else {
Response(user, true) //< - aquí, usar el tipo String funcionará
}
call.respond(response)
}
}
}
User
:
@Serializable
data class User(
val name: String,
val email: String,
val password: String
)
Response
:
@Serializable
data class Response(
val data: T,
val success: Boolean
)
Logs:
2021-12-02 18:04:34.214 [eventLoopGroupProxy-4-1] ERROR ktor.application - No tratado: GET - /users/7
kotlinx.serialization.SerializationException: No se ha encontrado un serializador para la clase 'Response'.
Marque la clase como @Serializable o proporcione el serializador explícitamente.
at kotlinx.serialization.internal.Platform_commonKt.serializerNotRegistered(Platform.common.kt:91)
at kotlinx.serialization.SerializersKt__SerializersKt.serializer(Serializers.kt:155)
Cualquier ayuda sería apreciada.
davy.ai
Pregunta
¿Cuál es el error en los registros y cómo puede ser resuelto?
Respuesta
El error en los registros dice que no se encuentra el serializador de la clase
Response
. Para resolver este error, necesitamos marcar la claseResponse
como serializable usando la anotación@Serializable
. Esto ya está hecho en el código proporcionado.Sin embargo, todavía hay un problema con la clase
Response
. Es una clase genérica y el tipo de su parámetro genérico no está especificado, lo que causa el error de serialización. Para solucionar esto, debemos proporcionar explícitamente el serializador para la claseResponse
llamando a la funciónserializer()
y pasando el tipo de su parámetro genérico.Podemos modificar la clase
Response
de la siguiente manera para especificar el serializador para su parámetro genérico:Aquí, hemos agregado un parámetro
with
a la anotación@Serializable
de la propiedaddata
, que especifica el serializador para el tipo genéricoT
. En este caso, estamos utilizando elPolymorphicSerializer
proporcionado por la bibliotecakotlinx.serialization
, que es un serializador para tipos polimórficos genéricos.Con esta modificación, el serializador para la clase
Response
ahora se proporciona explícitamente y el error de serialización debería estar resuelto.