2017-06-20 52 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