Ktor快速启动HTTP API-错误应用程序-未处理:GET-/ snippets

时间:2018-11-22 11:37:00

标签: kotlin jackson ktor

我是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()快速入门中那样使它工作吗?

1 个答案:

答案 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)
}