无法从Play 2.4中的WebSocket返回Future [JsValue]中的json

时间:2016-02-02 13:13:40

标签: json scala playframework websocket playframework-2.4

我已经实现了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)
}

futureJsonVariableFuture[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在线教程。任何帮助表示赞赏。

1 个答案:

答案 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功能执行类似操作。