2015-07-19 31 views
1

我想我的第一個噴霧+阿卡項目的工作。與問問模式噴霧路線預計ToResponseMarshallable

雖然這看起來好像直線前進,我仍然可以與解組類型錯誤(這我不需要,我返回一個字符串,因爲我最終會產生什麼,但XML。

package com.example.actors 

import akka.actor.{Props, ActorContext, Actor} 
import akka.util.Timeout 
import spray.http.CacheDirectives.`max-age` 
import spray.http.HttpHeaders.`Cache-Control` 
import spray.routing._ 
import spray.http._ 
import MediaTypes._ 
import scala.concurrent.duration._ 

class SprayActor extends Actor with DefaultService { 
    def actorRefFactory = context 
    def receive = runRoute(defaultRoute) 
} 

trait DefaultService extends HttpService { 
    def actorRefFactory: ActorContext 

    lazy val feedActor = actorRefFactory.system.actorOf(Props[MainFeedActor]) 

    import akka.pattern.ask 

    implicit val timeout = Timeout(5 seconds) // needed for `?` below 

    val defaultRoute = path("rss") { 
    get { 
     respondWithMediaType(`text/xml`) { 
     respondWithHeaders(`Cache-Control`(`max-age`(0))) { 
      complete { 
      (feedActor ? "rss").mapTo[String] 
      } 
     } 
     } 
    } 
    } 
} 

class MainFeedActor extends Actor { 
    val log = Logging(context.system, this) 

    override def receive: Receive = { 
    case "rss" => "<xml>test</xml>" 
    } 

這裏是編譯器錯誤:

[error] src/main/scala/com/example/actors/SprayActor.scala:31: type mismatch; 
[error] found : scala.concurrent.Future[String] 
[error] required: spray.httpx.marshalling.ToResponseMarshallable 
[error]    (feedActor ? "rss").mapTo[String] 
[error]         ^
[error] one error found 
[error] (compile:compile) Compilation failed 

回答

3

在噴霧的響應編組是相當複雜的使用magnet pattern,這使得它非常強大的和可調節(例如,通過只是自動添加SprayJsonSupport的進口所有JSON兼容case類是有效的響應)。

許多默認分辨率不起作用,因爲缺少一個或另一個隱含分辨率。在這種情況下,爲了期貨工作,ExecutionContext缺失。嘗試添加到服務:

private implicit def ec = actorRefFactory.dispatcher 

肯定給鏈接的文章閱讀,幫助我很多理解噴霧更好。

+0

謝謝埃爾瑪,很好接收。就是這樣。這是我第一次真正看到濫用暗示(包括所有這些磁鐵)的弊端。這些技巧真的讓我的解決問題的能力下降了兩檔。是的,你指出的那篇文章確實非常有幫助。 Kudos – sscarduzio