将 Spray Deserializer 转换为 Akka-Http Unarshaller
Converting a Spray Deserializer to an Akka-Http Unarshaller
我有以下来自 Spray 项目的 Deserializer
,我想将其移植到 Akka-Http。我刚开始使用 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 参数转换为我的应用程序的枚举类型,例如,这是一个利用反序列化器的隐式函数:
implicit val contentSourceDeserializer = new urlParameterEnumDeserializer[ContentSource](ContentSource)
我如何在 Akka-Http 中完成同样的事情?
想通了。 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}"))
}
}
}
我有以下来自 Spray 项目的 Deserializer
,我想将其移植到 Akka-Http。我刚开始使用 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 参数转换为我的应用程序的枚举类型,例如,这是一个利用反序列化器的隐式函数:
implicit val contentSourceDeserializer = new urlParameterEnumDeserializer[ContentSource](ContentSource)
我如何在 Akka-Http 中完成同样的事情?
想通了。 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}"))
}
}
}