9

スプレー 1.2 に更新した後、1.1 で完全に動作する JSON-Marshallers に関して問題が発生しました。HttpService 内で次のことを行う

trait TestHttpService extends HttpService with SprayJsonSupport with DefaultJsonProtocol{ self : ActorLogging =>
    case class Test(hallo: String, test: String)
    implicit val storyJsonFormat = jsonFormat2(Test.apply)

    def test(implicit m : Marshaller[Future[Test]]) = 17
    def hallo = test 
}

次のエラーが発生します。

could not find implicit value for parameter marshaller:
spray.httpx.marshalling.Marshaller[scala.concurrent.Future[amanuensis.story.Story]]

未来を削除すると、すべてうまくいきます:

trait TestHttpService extends HttpService with SprayJsonSupport with DefaultJsonProtocol { self : ActorLogging =>
    case class Test(hallo: String, test: String)
    implicit val storyJsonFormat = jsonFormat2(Test.apply)

    def test(implicit m : Marshaller[Test]) = 17
    def hallo = test

}

そのため、Story 自体のマーシャラーは暗黙のスコープにあるようです。以前は先物をマーシャリングできるようにするために他に何もする必要がなかったので、今は混乱しています。

ここで何が間違っているのか、ヒントをいただければ幸いです...

4

1 に答える 1

18

わかりました、解決策は簡単ですが、それを指すエラーメッセージがないため、見つけるのは非常に困難です:

暗黙的な Marshaller[Future[...]] も使用できるようにするには、スコープ内で暗黙的な実行コンテキストを指定する必要があります。私の場合:

trait TestHttpService extends HttpService with SprayJsonSupport with DefaultJsonProtocol{ self : ActorLogging =>
    //the following line was missing
    implicit def executionContext = actorRefFactory.dispatcher
    //
    case class Test(hallo: String, test: String)
    implicit val storyJsonFormat = jsonFormat2(Test.apply)

    def test(implicit m : Marshaller[Future[Test]]) = 17
    def hallo = test 
}

これは、spray 1.1、Scala 2.10.0、および akka 2.1 には当てはまりませんでした。

于 2013-11-06T18:46:56.977 に答える