首页 > 解决方案 > 如何知道 unmarshell 是否成功

问题描述

我有一条路线,它将把传入的实体解组为一个案例类。

final case class ProducerMessage(topic: String, event: String, data: spray.json.JsObject)


object ProducerServer {

  private val route: Route =   
    path("producer") {
        post {
          entity(as[ProducerMessage]) { msg =>
            //complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>"))
          }
        }
      }

  def create(): Future[ServerBinding] {
    Http().bindAndHandle(route, getServerIp, getServerPort)
  }

} 

我怎么知道 unmarshell 的过程是否成功?当接收到的数据不是有效的 JSON 格式时,会发生什么?

标签: scalaakka-http

解决方案


当你有entity(as[T])用于as[T]调用实例的FromRequestUnmarshaller[T]- 然后取决于 unmarshaller 返回的结果,entity将继续传递T到关闭,或者如果它会失败Directive

如果您需要对有关拒绝的信息进行处理,则可以使用类似的方法recover,您可以在之前调用这些方法apply

例如:

entity(as[ProducerMessage])
  .map(Right(_): Either[Seq[Rejection], ProducerMessage])
  .recover { rejections =>
    provide(Left(rejections): Either[Seq[Rejection], ProducerMessage]))
  } { value: Either[Seq[Rejection], ProducerMessage] =>
  ...
}

应该让您查看输入是否被拒绝并手动恢复/处理。


推荐阅读