使用Kotlin和WebSocket的SparkJava

使用Kotlin和WebSocket的SparkJava,websocket,kotlin,spark-java,Websocket,Kotlin,Spark Java,我正在用SparkJava试用Kotlin,但在实现WebSocket路由时遇到了问题。我试图遵循SparkJava网站()上提供的WebSockets示例,虽然我可以让OnWebSocketConnect和OnWebSocketMessage元素工作,但OnWebSocketClose没有被选中 我在Java中实现了这一点,以仔细检查它是否是浏览器问题,并且Java实现工作正常……因此这似乎是Kotlin解释OnWebSocketClose注释的特定方式 我的代码如下所示 import spa

我正在用SparkJava试用Kotlin,但在实现WebSocket路由时遇到了问题。我试图遵循SparkJava网站()上提供的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")
}
导入spark.spark*
导入org.eclipse.jetty.websocket.api.Session
导入org.eclipse.jetty.websocket.api.annotations.*;
趣味主线(args:Array){
staticFileLocation(“/public”)
webSocket(“/chat”,WSHandler::class.java)
init()
}
@网袋
类WSHandler{
@OnWebSocketConnect
连接的乐趣(会话:会话)=println(“连接的会话”)
@OnWebSocketClose
乐趣已关闭(会话:会话,状态代码:Int,原因:字符串)=println(“已关闭会话”)
@OnWebSocketMessage
有趣的消息(会话:会话,消息:字符串)=println(“get:$message”)
}

html/javascript等符合SparkJava网站上的教程

调用
org.eclipse.jetty.websocket.common.events.annotated.CallableMethod
类内部的
closed
方法时出错,消息如下:

指定为非null的参数为null:方法 webchat.WSHandler.closed,参数原因

它与Kotlin的可空性功能有关,当您使用下面的签名声明方法时,所有功能都可以正常工作:

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

太棒了,谢谢你。非常好的回答,顺便说一句,不仅仅是修复,还有错误的原因。