我正在开发一个用Kotlin后端和React前端编写的Web应用程序,该应用程序使用Ktor来设置Web服务器。我目前正在尝试使用来自Ktor示例聊天应用程序https://github.com/ktorio/ktor-samples/tree/master/app/chat/src的自定义会话模型来添加需要WebSocket连接的功能,并维护WebSocket会话的状态。
但是,我对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))
}
}
当我使用内置的React或React开发模式在Chrome上运行应用程序时,出现以下服务器端错误:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name]
当我在Firefox上运行它时,它会起作用,直到我将套接字参数名称从socket更改为mySocket为止,这时会出现错误:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name, socket]
我唯一能想到的是,它以某种方式在浏览器中缓存了类名,但这对我来说毫无意义。
答案 0 :(得分:0)
结果证明Ktor将反射数据存储在本地存储中。为什么?我不知道。清除浏览器数据即可解决此问题。