首页 > 解决方案 > 将 Spray Deserializer 转换为 Akka-Http Unarshaller

问题描述

Deserializer我想移植到 Akka-Http 的 Spray 项目中的以下内容。我刚开始使用 Akka-Http,所以我不确定如何移植此代码:

  class urlParameterEnumDeserializer[T](enum: AppEnum[T]) extends Deserializer[String, T] {
    def apply(s: String) = {
      enum.valueOf(s).toRight(MalformedContent(s"Expected a valid string for ${enum} conversion. Found: ${s}"))
    }
  }

它曾经允许我将传入的 url 参数转换为我的应用程序的 Enum 类型,例如,这是一个利用 Deserializer 的隐式函数:

implicit val contentSourceDeserializer = new urlParameterEnumDeserializer[ContentSource](ContentSource)

我将如何在 Akka-Http 中完成同样的事情?

标签: akka-httpsprayspray-routing

解决方案


想通了。Akka 有一些像这样的预罐头编组器FromStringUnmarshaller可以提供帮助。以下是我将枚举反序列化器转换为 Akka-Http UnMarshaller 的方法:

  class urlParameterCrowdscriberEnumDeserializer[T](enum: CrowdscriberEnum[T]) extends FromStringUnmarshaller[T] {
    override def apply(s: String)(implicit ec: ExecutionContext, materializer: Materializer): Future[T] = {
      enum.valueOf(s) match {
        case Some(e) => FastFuture.successful(e)
        case None => FastFuture.failed(new IllegalArgumentException(s"Expected a valid string for ${enum} conversion. Found: ${s}"))
      }
    }
  }


推荐阅读