无法从 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)
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 的最佳可用在线教程。任何帮助表示赞赏。
【问题讨论】:
【参考方案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