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

Posted

技术标签:

【中文标题】无法从 Play 2.4 中的 WebSocket 返回 Future[JsValue] 内的 json【英文标题】:Unable to return a json inside Future[JsValue] from a WebSocket in Play 2.4 【发布时间】:2016-02-02 13:13:40 【问题描述】:

我已经实现了 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】:

使用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 函数执行类似的操作。

【讨论】:

非常感谢您的帮助,它对我有用,但我可以问您一件事,如果您可以使用Left 和@987654336 给我一些关于上述代码的作用的解释@,您是否做过类似将in,out 映射到Future 变量并直接将它们发送到Right 的事情?

以上是关于无法从 Play 2.4 中的 WebSocket 返回 Future[JsValue] 内的 json的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

无法使用 intellij 14 解析路由文件中的符号并播放框架 2.4 reactivemongo

如何在 play 2.4 中使用 CommonsMailerPlugin

在启动时向 Play 2.4 中的演员注入服务

play1.2.4框架html中无法显示错误信息

如何在 play 2.4 中的 scala 模板中设置类型列表字段的值?