Я работаю над веб-приложением, написанным с использованием бэкэнда Kotlin и React, которое использует Ktor для настройки веб-сервера. В настоящее время я пытаюсь добавить функциональность, для которой требуется соединение WebSocket, и поддерживать состояние в течение сеанса WebSocket, используя пользовательскую модель сеанса из примера приложения чата Ktor здесь: https://github.com/ktorio/ktor-samples/tree/master/app/chat/src.
Однако у меня возникает проблема с отражением, которое Ktor делает для создания этих сессий.
Пользовательский сеанс определяется следующим образом:
data class THavalonUserSession(val id: String,
var name: String, var socket: DefaultWebSocketSession?)
И инициализируется в следующем блоке:
intercept(ApplicationCallPipeline.Features) {
if (call.sessions.get<THavalonUserSession>() == null) {
call.sessions.set(THavalonUserSession(generateNonce(), "", null))
}
}
Когда я запускаю приложение в Chrome, либо со встроенным React, либо в режиме разработки React, я получаю следующую ошибку на стороне сервера:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name]
Когда я запускаю его в Firefox, он работает, пока я не изменю имя параметра сокета с сокета на mySocket, после чего он выдаст ошибку:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name, socket]
Единственное, о чем я могу думать, это то, что он как-то кэширует имена классов в браузере, но для меня это не имеет смысла.