2014-09-24 69 views

回答

6

使用內置JSON幀格式,你不能,這裏的源代碼:

https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/mvc/WebSocket.scala#L80

如果Json.parse拋出一個異常,它會拋出異常的Netty,這將提醒Netty異常處理程序,它將關閉WebSocket。

你可以做什麼,是自己定義的JSON幀格式處理異常:

import play.api.mvc.WebSocket.FrameFormatter 

implicit val myJsonFrame: FrameFormatter[JsValue] = implicitly[FrameFormatter[String]].transform(Json.stringify, { text => 
    try { 
    Json.parse(text) 
    } catch { 
    case NonFatal(e) => Json.obj("error" -> e.getMessage) 
    } 
}) 

def socket = WebSocket.acceptWithActor[JsValue, JsValue] { request => out => 
    MyWebSocketActor.props(out) 
} 

在你的WebSocket的演員,那麼你可以檢查有錯誤場JSON消息,並作出迴應根據你的意願。

+0

謝謝。它運行良好。 我以前使用過WebSocket.acceptWithActor [String,JsValue]。 你的答案更聰明。 – shiina 2014-09-24 02:30:36

+0

你會如何用java版本的acceptWithActor來做到這一點?在播放2.3中,當您發送非json的東西時,WebSocket.withActor(MyWebSocketActor :: props)將使服務器崩潰。 – rawphl 2015-03-30 15:09:03