1

このコードは、 のコンパイル エラーになりcould not find implicit value for parameter marshaller: spray.httpx.marshalling.ToResponseMarshaller[List[akka.actor.ActorRef]]ます。

ActorRefこれをに変更する.mapTo[List[String]]と同じコンパイルエラーが表示されるため、問題は ではないと思います

一般に、スプレーがすべての暗黙的要素をマーシャリングする方法はやや混乱しています。これを明示的にする方法はありListProtocol.marshal(value)ますか?

import akka.actor.Actor
import spray.http.HttpResponse
import spray.http.HttpRequest
import spray.http.Uri
import spray.http._
import spray.routing._
import HttpMethods._
import akka.actor.ActorRef
import akka.pattern.ask
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Success
import scala.util.Failure
import spray.http.StatusCodes.InternalServerError
import spray.json.DefaultJsonProtocol
import spray.httpx.SprayJsonSupport._
import spray.httpx.marshalling._
import spray.http._

class HttpApi(val manager: ActorRef) extends HttpServiceActor {

  def receive = runRoute {
    path("nodes") {
      get {
        onComplete(manager.ask(NodeList())(3.seconds).mapTo[List[ActorRef]]) {
          case Success(value) => {
            // Compile error happens here
            complete(value)
          }
          case Failure(ex) => {
            complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
          }
        }
      }
    }
  }
}
4

1 に答える 1

7

このインポートを変更

import spray.json.DefaultJsonProtocol

import spray.json.DefaultJsonProtocol._

つまり、オブジェクト自体ではなく、そのオブジェクトで定義された暗黙をインポートする必要があります。

別の方法として、トレイトを拡張して Implicit を取得することもできます。

class HttpApi(val manager: ActorRef) extends HttpServiceActor
                                        with DefaultJsonProtocol {
于 2014-09-20T20:45:16.497 に答える