2017-06-20 106 views
1

我正在尝试使用SparkJava的Kotlin,并且无法实现WebSockets路由。我试图遵循SparkJava网站上提供的WebSockets示例(http://sparkjava.com/tutorials/websocket-chat),虽然我可以使OnWebSocketConnect和OnWebSocketMessage元素工作,但OnWebSocketClose不会被拾取。SparkJava使用Kotlin和WebSockets

我已经在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网站上的教程。

回答

3

有深内部org.eclipse.jetty.websocket.common.events.annotated.CallableMethod类具有以下消息closed方法的调用期间的错误:

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

它关系到科特林的空性功能,当您使用下面的签名声明你的方法,一切工作正常:

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

太棒了,谢谢。顺便说一句,优秀的答案,不仅是修复,而是错误的原因。 – Codemwnci