【问题标题】:Getting implicit val from the companion object从伴随对象中获取隐式 val
【发布时间】:2017-06-14 00:37:40
【问题描述】:

我在玩 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")
          }
        }
      }
    }
}

但是当我将案例类和协议移动到伴随对象时,它不会编译(找不到 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)
  }
}

我不明白为什么..

【问题讨论】:

    标签: scala implicit spray


    【解决方案1】:

    我认为问题可能出在您的导入语句中。如果您从伴随对象导入,则应该这样做:

    trait StatusService extends HttpService {
    
      import StatusService.StatusResponseProtocol._
    

    其余代码无需更改。

    【讨论】:

    • 你能添加编译器的全部输出吗?
    【解决方案2】:

    我想我也遇到过同样的问题。尝试替换:

    import spray.httpx.SprayJsonSupport._
    

    import spray.json._
    

    它对我有用。

    【讨论】:

      【解决方案3】:

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

      所以,我在想这是否会适用于你的情况:

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

      注意:我不确定我添加的类型 - 它可能不是 jsonFormat1 返回的类型。此外,Spray.json 文档不使用类型。无论如何,如果有人有时间尝试一下,我很想知道..

      【讨论】:

      • 有趣。感谢分享!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多