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



我已经实现了Play框架的WebSocket,以便使用WebSocket而不是Http执行服务器通信。我创建了一个函数作为WebSocket.using[JsValue].我的 json 响应存储在Future[JsValue]变量中,我正在尝试从变量中获取并返回 json 值Future[JsValue]。但是,我无法从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的最佳在线教程。任何帮助,不胜感激。

使用 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, ...]允许您通过在Left分支中提供play.api.mvc.Result来处理发生意外情况的情况,以计算未来值A。推论是,您还需要将"快乐路径"(没有任何错误)包装在Right中,在这种情况下,您通常会从using返回迭代/枚举器元组。

您可以使用 tryAcceptWithActor 函数执行类似的操作。

相关内容

  • 没有找到相关文章

最新更新