我正在玩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)
}
}
我不明白为什么......
答案 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文档不使用类型。无论如何,如果有人有时间试试这个,我有兴趣知道..