用于创建自定义 WebSocket 会话的 Ktor 反射不会更新构造函数参数
Ktor reflection to create custom WebSocket session doesn't update constructor parameters
我正在开发一个使用 Kotlin 后端和 React 前端编写的 Web 应用程序,它使用 Ktor 来设置 Web 服务器。我目前正在尝试添加需要 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 上 运行 它时,它可以工作,直到我将套接字参数名称从 socket 更改为 mySocket,此时它给出错误:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name, socket]
我唯一能想到的是它以某种方式在浏览器中缓存 class 个名称,但这对我来说毫无意义。
原来Ktor在本地存储了反射数据。为什么?我不知道。清除浏览器数据以解决此问题。
我正在开发一个使用 Kotlin 后端和 React 前端编写的 Web 应用程序,它使用 Ktor 来设置 Web 服务器。我目前正在尝试添加需要 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 上 运行 它时,它可以工作,直到我将套接字参数名称从 socket 更改为 mySocket,此时它给出错误:
java.lang.IllegalArgumentException: Couldn't instantiate type class main.THavalonUserSession for parameters [id, name, socket]
我唯一能想到的是它以某种方式在浏览器中缓存 class 个名称,但这对我来说毫无意义。
原来Ktor在本地存储了反射数据。为什么?我不知道。清除浏览器数据以解决此问题。