使用 Kotlin 和 WebSockets 的 SparkJava

SparkJava using Kotlin and WebSockets

我正在使用 SparkJava 试用 Kotlin,但在实现 WebSockets 路由时遇到了问题。我正在尝试遵循 SparkJava 网站 (http://sparkjava.com/tutorials/websocket-chat) 上提供的 WebSockets 示例,虽然我可以让 OnWebSocketConnect 和 OnWebSocketMessage 元素工作,但 OnWebSocketClose 没有被拾取。

我已经在 Java 中实现了这个以仔细检查它不是浏览器问题,并且 Java 实现工作正常......所以这似乎是 Kotlin 的特定方式正在解释 OnWebSocketClose 注释。

我的代码如下所示

import spark.Spark.*
import org.eclipse.jetty.websocket.api.Session
import org.eclipse.jetty.websocket.api.annotations.*;

fun main(args: Array<String>) {
    staticFileLocation("/public")
    webSocket("/chat", WSHandler::class.java)
    init()
}

@WebSocket
class WSHandler {

    @OnWebSocketConnect
    fun connected(session: Session) = println("session connected")

    @OnWebSocketClose
    fun closed(session: Session, statusCode: Int, reason: String) = println("closed sessions")

    @OnWebSocketMessage
    fun message(session: Session, message: String) = println("Got: $message")
}

html / javascript 等按照 SparkJava 网站上的教程进行。

org.eclipse.jetty.websocket.common.events.annotated.CallableMethod class 深处调用 closed 方法时出现错误,并显示以下消息:

Parameter specified as non-null is null: method webchat.WSHandler.closed, parameter reason

它与 Kotlin 的可空性特性有关,当您使用下面的签名声明您的方法时一切正常:

fun closed(session: Session, statusCode: Int, reason: String?)