Ktor QUICK START HTTP API - Приложение ОШИБКИ - необработанное: GET - / snippets - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в Ktor, и в настоящее время я использую Быстрый старт 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 голосов
/ 22 ноября 2018

Обнаружена проблема.

Использование опции watch в файле application.conf для запуска сервера, похоже, испортило пару вещей.

файл 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)
}
...