2014-09-24 52 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