我正在寻求创建一个 JSON API,其中一些模型可以很好地概括。我是 Spray 的新手,所以我用一个过于简化的例子开始了一个尖峰。
但是我无法弄清楚下面的代码发生了什么......
我都进口了
- 我的自定义隐含和
- spray.httpx.SprayJsonSupport._
据我了解,这是我必须做的,以便拥有可以从 JsonFormat 转换为 Marshaller 的隐式范围。
编译器错误:
TestService.scala:15:找不到参数 um 的隐式值:spray.httpx.unmarshalling.FromRequestUnmarshaller[my.company.Test[my.company.X]]
代码:
package my.company
import spray.routing.HttpService
import spray.json.{JsValue, JsObject, JsonFormat, DefaultJsonProtocol}
trait TestService extends HttpService {
import my.company.TestImplicits._
import spray.httpx.SprayJsonSupport._
val test =
path("test") {
post {
entity(as[Test[X]]) {
test => {
complete(s"type: ${test.common}")
}
}
}
}
}
trait Common {
def commonData: String
}
case class X(id: Long, commonData: String) extends Common
case class Y(commonData: String) extends Common
case class Test[T <: Common](comment: String, common: T)
object TestImplicits extends DefaultJsonProtocol {
implicit val xFormat = jsonFormat2(X)
implicit val yFormat = jsonFormat1(Y)
implicit val yTestFormat: JsonFormat[Test[Y]] = new JsonFormat[Test[Y]] {
def write(test: Test[Y]) = JsObject()
def read(js: JsValue) = Test("test", Y("y"))
}
implicit val xTestFormat: JsonFormat[Test[X]] = new JsonFormat[Test[X]] {
def write(test: Test[X]) = JsObject()
def read(js: JsValue) = Test("test", X(1L, "y"))
}
}
我将不胜感激任何帮助。提前致谢。
解决了
解决方案是(正如@jrudolp 建议的那样):
- 在文件顶部移动隐式定义(令人惊讶)
- 创建 RootJsonFormat 而不是 JsonFormat。