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な定義をスコープにインポートするのを忘れていることですが、私はこれを忘れていませんでした。もう 1 つの理由は、FlowMaterializerの代わりにスコープ内に暗黙的を指定している可能性がありますActorMaterializerが、ImplictMaterializer特性がこれを処理します。

私が行方不明になる可能性のあるものは他にありますか?

Scala 2.11.7、Akka 2.3.11、akka-http 1.0、spray-json 1.3.2 を使用しています。

4

3 に答える 3

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)
}

次に、それを Web ルートを含むオブジェクトに混ぜます。次のようになります。

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

特性ActorMaterializerの範囲で必要だったようです。RoadMapしたがって、implicit val materializer: ActorMaterializerそこに追加することでコンパイルの問題が解決しました。

そのエラーがもう少し説明的だったらいいのに....

于 2015-11-12T04:32:22.977 に答える