4

我知道已经有人问过了,但我似乎找不到答案。这是我的代码:

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json.DefaultJsonProtocol

final case class Client(clientId:Int, clientName:String, platformIds:Int, host:String, password:String)

object ClientJson extends DefaultJsonProtocol with SprayJsonSupport {
    implicit val clientFormat = jsonFormat5(Client)
}

class HTTPListenerActor extends Actor with ImplicitMaterializer with RoadMap {

implicit val conf = context.system.settings.config
implicit val system = context.system
implicit val ec = context.dispatcher


Await.result(Http().bindAndHandle(roads, "interface", 8080), Duration.Inf)

override def receive:Receive = Actor.emptyBehavior
}

trait RoadMap extends Directives  {

val roads: Route = path("client"/IntNumber) { id =>
    import ClientJson._
    post {
        entity(as[Client]) { c => complete {c} }
    }
  }
}

此代码生成错误

 [ant:scalac] /Users/smalov/Workspace/api-service/src/main/scala/com/acheron/HTTPListenerActor.scala:51: error: could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[com.acheron.Client]
 [ant:scalac]           entity(as[Client]) { c =>

现在这种错误最常见的原因是忘记将编组隐式导入roads定义附近的范围,但是,我没有忘记这一点。另一个原因可能是我FlowMaterializer在范围内隐含而不是ActorMaterializer,但ImplictMaterializertrait 可以解决这个问题。

还有什么我可能会丢失的吗?

我正在使用 Scala 2.11.7、Akka 2.3.11、akka-http 1.0、spray-json 1.3.2

4

3 回答 3

16

我也遇到了同样的错误,导入后解决了

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._

可能这会有所帮助

于 2016-12-15T22:27:44.310 回答
4

导入这些东西。

import spray.json.RootJsonFormat
import spray.json.DefaultJsonProtocol._

然后在您调用时将其包含在范围内entity(as[Client])

implicit val clientJsonFormat: RootJsonFormat[Client] = jsonFormat5(Client)

将其纳入范围的常规方法是将这些纳入特征,例如

trait MyJSON extends SprayJsonSupport with DefaultJsonProtocol with NullOptions {
    implicit val clientJsonFormat: RootJsonFormat[Client] = jsonFormat5(Client)
}

然后,您将其混合到包含您的网络路由的对象中,因此:

object MyWeb extends MyJSON {
    val myRoute = 
        get {
            path("client") {
                complete(Future successful Client(...))
            }
        } ~ post {
            path("client") {     
                entity(as[Client]) { client =>
                   ...
                }
            }
        }
}
于 2018-04-21T07:19:48.920 回答
3

看来我需要ActorMaterializerRoadMap特质范围内。因此,implicit val materializer: ActorMaterializer在那里添加解决了编译问题。

我希望该错误更具描述性....

于 2015-11-12T04:32:22.977 回答