将 acceptWithActor 与自定义类型一起使用时,如何捕获 JSON 解析错误?

How do I catch a JSON parse error when using acceptWithActor with custom types?

我在 Play 框架 2.3 中使用 websockets。

引用来自 the official how-to page 的这个片段。

import play.api.mvc._
import play.api.Play.current

def socket = WebSocket.acceptWithActor[InEvent, OutEvent] { request => out =>
  MyWebSocketActor.props(out)
}

如何捕获 JSON 解析错误(RuntimeException:解析 JSON 时出错)?

这个问题与下面链接的问题非常相似,但是,我使用的是自定义类型(InEvent、OutEvent)而不是 JsValue 类型。我不想转换为 JsValue 或字符串。如果成功,我需要它转换为 InEvent 类型,或者抛出更具描述性的错误。

How do I catch json parse error when using acceptWithActor?

在您的范围内某处有 FrameFormatter[InEvent]FrameFormatter[OutEvent] 的隐式定义:

implicit val inEventFrameFormatter = FrameFormatter.jsonFrame[InEvent]
implicit val outEventFrameFormatter = FrameFormatter.jsonFrame[OutEvent]

你只需要重写它们,而不是使用预定义的 jsonFrame 自定义方法,如 customJsonFrame:

def customJsonFrame[A: Format]: FrameFormatter[A] = 
  FrameFormatter.jsonFrame.transform[A](
    out => Json.toJson(out),
    in => Json.fromJson[A](in).fold(
      error => throw new CustomException(),
      a => a
    )
  )

并将上述行替换为:

implicit val inEventFrameFormatter = customJsonFrame[InEvent]
implicit val outEventFrameFormatter = customJsonFrame[OutEvent]