1

我正在寻求创建一个 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。
4

0 回答 0