创建自定义WebSocket会话的Ktor反射不会更新构造函数参数

时间:2019-05-17 14:48:58

标签: kotlin websocket ktor

我正在开发一个用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]

我唯一能想到的是,它以某种方式在浏览器中缓存了类名,但这对我来说毫无意义。

1 个答案:

答案 0 :(得分:0)

结果证明Ktor将反射数据存储在本地存储中。为什么?我不知道。清除浏览器数据即可解决此问题。