#java #kotlin #ktor
#java #kotlin #ktor
Вопрос:
Привет, я пытаюсь использовать Ktor с помощью Kotlin. Но у меня проблема при доступе к веб-странице с помощью «/».
embeddedServer(Netty, port) {
install(FreeMarker) {
templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates")
outputFormat = HTMLOutputFormat.INSTANCE
}
routing {
static("/static") {
resources("files")
}
get("/") {
call.respond(FreeMarkerContent("index.ftl", mapOf("entries" to blogEntries), ""))
}
}
}.start(wait = false)
Вот мой код, который я использую. Я не могу найти ошибку, в консоли есть только это сообщение:
[eventLoopGroupProxy-4-1] INFO ktor.application - Unhandled: GET - /, io failed
Есть ли у кого-нибудь идея, как я могу исправить эту ошибку?
Комментарии:
1. Я не знаю эту библиотеку, но похоже, что она обработала исключение внутри. Сообщение представляет собой довольно стандартное сообщение о ведении журнала, если у вас есть какой-то регистратор, настроенный для проекта, вы можете найти там трассировку стека. В противном случае проверьте страницу библиотеки для поддержки сообщества, это может быть распространенной проблемой.
Ответ №1:
Точная строка, в которой генерируется это сообщение, находится в io.ktor.server.engine.logFailure
: https://github.com/ktorio/ktor/blob/2e1b0046e4235865da7cbbfbf2e887f410775278/ktor-server/ktor-server-host-common/jvm/src/io/ktor/server/engine/DefaultEnginePipeline.kt#L107
private fun ApplicationEnvironment.logFailure(call: ApplicationCall, cause: Throwable) {
...
is IOException -> log.info("$status: $logString, io failed: ${cause.message ?: "unknown error"}")
...
}
Добавьте точку останова в эту строку. Затем, когда ваше приложение завершится с ошибкой, cause
оно будет содержать реальное исключение.
В моем случае это была ошибка в шаблоне FreeMarker. Что странно, потому что обычно эти исключения печатаются нормально. На этот раз он только напечатан Unhandled: <route>, io failed
.
Похоже, что это ошибка в Ktor: эти исключения генерируются в обычном режиме и достаточно часто, чтобы вы не хотели полную трассировку стека. Но иногда (как в этом случае) исключение не является нормальным, и вам нужна трассировка стека.
Ответ №2:
Я предлагаю использовать функцию отслеживания вызовов и трассировки маршрутов для устранения вашей проблемы.