akka-http - 将 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 有一些像这样的预罐头编组器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}"))
}
}
}
推荐阅读
- javascript - 以前在 eventloop 上有效吗?微任务或宏任务?
- reactjs - antd SubMenu "TypeError: 无法读取未定义的属性 'isRootMenu'"
- amazon-s3 - Minio 获取存储统计信息(已用空间、可用空间)
- ios - iOS 应用扩展中的访问令牌刷新
- asp.net - 从命令行启动 azure 项目
- ruby - Ruby Git Diff 行信息解析器
- watson-dialog - 如何编辑/保存上下文变量的 IBM watson 助手条件槽值?
- python - 类中的 Python 方法
- postgresql - 函数中的 for 循环无效
- r - 在 R 中比较值和生成新列的有效方法