我是Ktor的新手,我目前正在使用quick start http api,但收到错误消息:
错误应用程序-未处理:GET-/ snippets com.fasterxml.jackson.databind.JsonMappingException:无法将kotlin.reflect.jvm.internal.KClassImpl强制转换为kotlin.reflect.jvm.internal.KClassImpl(通过参考链:java.util.Collections $ Singleton Map [“ snippets”]-> java.util.ArrayList [0])
代码:
import com.fasterxml.jackson.databind.SerializationFeature
import io.ktor.application.*
import io.ktor.features.CallLogging
import io.ktor.features.ContentNegotiation
import io.ktor.features.DefaultHeaders
import io.ktor.jackson.jackson
import io.ktor.request.receive
import io.ktor.response.respond
import io.ktor.response.respondText
import io.ktor.routing.Routing
import io.ktor.routing.get
import io.ktor.routing.post
import io.ktor.routing.routing
import java.util.*
data class Snippet(val text: String)
val snippets = Collections.synchronizedList(mutableListOf(
Snippet("hello"),
Snippet("world")
))
fun Application.main() {
install(ContentNegotiation) {
jackson {
enable(SerializationFeature.INDENT_OUTPUT)
}
}
routing {
get("/snippets") {
call.respond(mapOf("snippets" to synchronized(snippets) { snippets.toList() }))
}
}
}
如果我改用这个:
call.respond(mapOf("snippets" to synchronized(snippets) { snippets.toString() }))
它返回:
{
"snippets" : "[Snippet(text=hello), Snippet(text=world)]"
}
但是现在它使用的是toString()而不是toList(),我知道如何像使用toList()快速入门中那样使它工作吗?
答案 0 :(得分:0)
发现了问题。
使用application.conf文件中的watch选项运行服务器似乎使事情变得混乱。
application.conf文件:
ktor {
deployment {
port = 8080
watch = [ / ]
}
application {
modules = [ com.MainKt.main ]
}
}
移除
watch = [ / ]
或切换回嵌入式服务器似乎已解决了该问题。
fun main() {
embeddedServer(Netty, 8080) {
//rest of the code
}.start(wait = true)
}