2015-04-06 65 views
0

我在玩Scala Spray。我喜歡與它合作,但無法弄清楚一件事。從伴侶對象獲取隱式val

此代碼編譯罰款:

import spray.http.MediaTypes._ 
import spray.routing.HttpService 
import spray.json.{DefaultJsonProtocol, _} 
import spray.httpx.SprayJsonSupport._ 

trait StatusService extends HttpService { 

    case class StatusResponse(status: String) 

    object StatusResponseProtocol extends DefaultJsonProtocol { 
    implicit val statusResponse = jsonFormat1(StatusResponse) 
    } 

    import StatusResponseProtocol._ 

    val statusRoute = 
    path("status") { 
     get { 
     respondWithMediaType(`application/json`) { 
      complete { 
      StatusResponse("OK") 
      } 
     } 
     } 
    } 
} 

不過,這並不編譯(找不到JSON序列)當我移動的情況下類&協議同伴對象。

trait StatusService extends HttpService { 

    import StatusResponseProtocol._ 

    val statusRoute = 
    path("status") { 
     get { 
     respondWithMediaType(`application/json`) { 
      complete { 
      StatusResponse("OK") 
      } 
     } 
     } 
    } 
} 

object StatusService { 

    case class StatusResponse(status: String) 

    object StatusResponseProtocol extends DefaultJsonProtocol { 
    implicit val statusResponse = jsonFormat1(StatusResponse) 
    } 
} 

我不明白爲什麼..

回答

2

我想問題可能是在你的import語句。如果從同伴對象導入,應該按如下方式進行:

trait StatusService extends HttpService { 

    import StatusService.StatusResponseProtocol._ 

其餘代碼不必更改。

+0

它不會改變任何東西,不幸的是.. – cyrillk

+0

你可以添加從編譯器的整個輸出? – Ashalynd

0

我想我有幾乎相同的問題。嘗試更換:

import spray.httpx.SprayJsonSupport._ 

import spray.json._ 

它爲我工作。

0

我今天注意到(在另一個上下文中,不是Spray),在配對對象中爲implicit val提供一個類型使其可見。

所以,我想,這是否會使其工作你的情況:

implicit val statusResponse: RootJsonFormat[StatusResponse] = jsonFormat1(StatusResponse) 

注:我不知道我說的類型 - 這可能不是什麼jsonFormat1回報。另外,Spray.json文檔不使用類型。無論如何,如果有人有時間來嘗試這一點,我有興趣知道..

+0

有趣。感謝分享! – cyrillk