从伴随对象获取隐式val

时间:2015-04-06 21:55:56

标签: scala implicit spray

我正在玩Scala Spray。我喜欢与它合作,但无法弄清楚一件事。

此代码编译良好:

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")
          }
        }
      }
    }
}

但是当我移动case class&时它不会编译(找不到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)
  }
}

我不明白为什么......

3 个答案:

答案 0 :(得分:2)

我认为问题可能在您的import语句中。如果从伴随对象导入,则应按如下方式进行:

trait StatusService extends HttpService {

  import StatusService.StatusResponseProtocol._

其余代码不必更改。

答案 1 :(得分:0)

我认为我有同样的问题。尝试更换:

import spray.httpx.SprayJsonSupport._

import spray.json._

它对我有用。

答案 2 :(得分:0)

我今天注意到(在另一个上下文中,不是Spray),在伴随对象中为implicit val提供一个类型使其可见。

所以,我在想这是否会使你的情况有效:

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

注意:我不确定我添加的类型 - 它可能不是jsonFormat1返回的内容。此外,Spray.json文档不使用类型。无论如何,如果有人有时间试试这个,我有兴趣知道..