2016-02-02 30 views
0

我已經實現了Play框架的WebSocket,以便使用WebSocket而不是Http執行服務器通信。我創建了一個函數WebSocket.using[JsValue]。我的JSON響應存儲在Future[JsValue]變量中,我試圖從Future[JsValue]變量中獲取並返回json值。不過,我一直無法返回Future[JsValue]變量的json數據。當我嘗試創建WebSocket功能爲WebSocket.using[Future[JsValue]]時,在這種情況下,我無法爲其創建json FrameFormatter無法從播放2.4中的WebSocket返回未來[JsValue]中的json

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函數做類似的事情。

+0

非常感謝您的幫助,它爲我工作,但我可以問你一件事情,如果你可以給我一點關於上述代碼的解釋,使用'Left'和'Right',並且讓你做了像你一樣將'in,out'映射到'Future'變量並直接將它們發送到'Right'? –