2014-02-23 31 views

回答

6

這裏可能有兩個選擇:要麼它在你的程序中的錯誤,或者你沒有提供任何噴灑方式馬歇爾你Foo類型,導致FutureOption默認處理。現在,如果你犯了一個GET請求上/測試,你會得到一個正確的響應

val route = { 
    (get & path("test")) { 
    complete { 
     Future(Option("Hello Spray!")) 
    } 
    } 
} 

:E.g這條線路可以通過標準噴霧marshallers沒有任何問題的處理。

如果您有特定的類型,那麼您需要爲您提供ToResponseMarshallable類型的編組,以通過隱式上下文來篩選。我認爲最常見和最簡單的方法是使一個JSON響應,爲此,你需要噴霧JSON(或其他一些支持JSON LIB),只是提供了一個轉換器,JSON,如:

import spray.json.DefaultJsonProtocol._ 

case class Boy(name: String, age: String) 
object Boy { 
    implicit val boyJson = jsonFormat2(Boy.apply) 
} 

現在剩下的唯一要做的就是將一個json編組放入範圍:

import spray.httpx.SprayJsonSupport._ // import json marshaller 

val route = { 
    (get & path("test") { 
    complete { 
     Future(Option(Boy("Name", 0))) 
    } 
    } 
} 

現在您將得到一個json響應。如果您需要其他類型的迴應,請爲Boy類型製作自定義編組器。

+0

非常清楚的解釋! +1 –

+0

@ 4lex1v在此類型不匹配中複製並粘貼您的示例結果:'expected:ToResponseMarshallable,actual:Future [Option [TestRoute.this.Boy]]'。 TestRoute是「路由」存在的特徵。自2014年起,需求變更了嗎? – ecoe

1

總之 - 是的,但你需要讓編譯器高興。

Spray讓你可以返回Future或簡單的迴應,只要它可以編組回來的迴應。您需要確保在爲您進行編組的範圍內進行隱式轉換,或者明確地轉換您的對象。

以下是響應變換的執行方式:http://spray.io/documentation/1.2.0/spray-httpx/response-transformation/

0

對於仍然有問題的人在完整的塊中返回未來,請確保在範圍內具有執行上下文,如scala.concurrent.ExecutionContext.Implicits.global! IDE往往不明白這是問題,可能會讓你失望。