使用 akka-http 时的问题,circe

问题描述

假设我有这样的层次结构:

sealed trait Animal {
  def eat = println("eating!")
}
final case class Dog(name :String) extends Animal {override def eat= println("dog eating")}
final case class Cat(name: String) extends Animal {override def eat= println("cat eating")}

如您所见,我正在使用 akka http 和 circe,然后我有以下内容:

import io.circe.syntax._
import io.circe.Json
...
pathPrefix("path" / "something") { 
post {
   entityAs[Map[String,Json]] { data => 

      // depending on the key of the map I will create an object Dog or Animal
      val transformed = data.map { d => 
         d._1 match {
            case "dog" => d._2.as[Dog]
            case "cat" => d._2.as[Cat]
         }
      }

      // then I will do something like
      transformed.foreach(_.eat)

      complete(Status.OK)
   }
}

但由于某种原因我不能使用方法 eat。 我看到 transformed 的类型是 immutable.Iterable[Result[_ >: Dog with Cat <: Animal]] 我猜这就是阻止我调用 eat 方法的问题。

有没有办法解决这个问题,以便能够调用 eat 事件?

解决方法

如您所见,您获得的价值是:

Iterable[Result[_ >: Dog with Cat <: Animal with Product]]

同时:

final type Result[A] = Either[DecodingFailure,A]

为了访问 eat 方法,您必须:

transformed.foreach(_.map(_.eat))
,

从你的角度来看,每次 map key 为 dog 时,其值为 Dog 类,但编译器不知道这一点。

这就是为什么transformed是Iterable[Result[X]],当遍历iterable时,你试图在Result类型上调用eat方法。

您必须从 Result 对象中提取值,前提是它已正确反序列化

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...