我已经实现了Play框架的WebSocket
,以便使用WebSocket而不是Http执行服务器通信。我创建了一个函数WebSocket.using[JsValue]
。我的json响应存储在Future[JsValue]
变量中,我试图从Future[JsValue]
变量中获取并返回json值。但是我无法从Future[JsValue]
变量返回json数据。当我尝试将WebSocket函数创建为WebSocket.using[Future[JsValue]]
时,在这种情况下,我无法为其创建json FrameFormatter
。
def socketTest = WebSocket.using[JsValue] { request =>
val in = Iteratee.ignore[JsValue]
val out = Enumerator[JsValue](
Json.toJson(futureJsonVariable)
).andThen(Enumerator.eof)
(in, out)
}
futureJsonVariable
是Future[JsValue]
类型的变量在上面的代码中,运行时的错误是No Json serializer found for type scala.concurrent.Future[play.api.libs.json.JsValue]. Try to implement an implicit Writes or Format for this type.
如何在Scala中使用WebSocket方法返回json?如何使用Actor类实例实现?如果有人知道Play框架中最好的WebSocket在线教程。任何帮助表示赞赏。
答案 0 :(得分:1)
使用tryAccept
返回 兑换时的未来结果或错误:
def socketTest = WebSocket.tryAccept[JsValue] { request =>
futureJsonVariable.map { json =>
val in = Iteratee.ignore[JsValue]
val out = Enumerator(json).andThen(Enumerator.eof)
Right((in, out))
} recover {
case err => Left(InternalServerError(err.getMessage))
}
}
这与using
类似,但返回Future[Either[Result, (Iteratee[A, _], Enumerator[A])]]
。 Either[Result, ...]
允许您通过在A
分支中提供play.api.mvc.Result
来处理发生意外情况的情况,从而计算未来值Left
。结果是你还需要包裹“快乐的道路”。 ({1}}中没有出错的地方,在这种情况下,你通常从Right
返回的iteratee / enumerator元组。
您可以使用using
功能执行类似操作。