在akka-http Scala中将通用类型注册到spray-json-support的正确方法是什么?

时间:2018-11-05 04:34:30

标签: scala generics akka akka-http spray-json

所以,我有这个课:

case class Something[T](data: Option[T] = None)

我按照https://github.com/spray/spray-jsonhttps://doc.akka.io/docs/akka-http/current/common/json-support.html中的说明进行注册。像这样:

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json.DefaultJsonProtocol

trait InternalJsonFormat extends SprayJsonSupport with DefaultJsonProtocol {
    import spray.json._

    implicit def somethingFormat[A :JsonFormat] = jsonFormat1(Something.apply[A])
}

最后,我从akka http指令中使用了complete。像这样:

import akka.http.scaladsl.server.Directives._

object ResponseIt extends InternalJsonFormat {
    def apply[T](rawData: T) = {
        val theResponse = Something(data = Some(rawData))
        complete(theResponse)
    }
}

然后我在complete(theResponse)中遇到错误。它说

Type mismatch, expected: ToResponseMarshallable, actual: Something[T]

================================================ ===========

我尝试编辑最后一个代码以进行调试,例如:

object ResponseIt extends InternalJsonFormat {
    import spray.json._

    def apply[T](rawData: T) = {
        val theResponse = Something(data = Some(rawData))
        val trying = theResponse.toJson
        complete(theResponse)
    }
}

,并在val trying = theResponse.toJson中得到新的错误。像这样:

No implicits found for parameter writer: JsonWriter[Something[T]] 

所以,我真的很困惑我的代码有什么问题?有什么正确的方法可以在akka http中使用spray json支持吗?

预先感谢

1 个答案:

答案 0 :(得分:2)

您看到的,JsonFormat上没有T存在的证据:

 def apply[T](rawData: T) = {
        // ^--- here
        val theResponse = Something(data = Some(rawData))
        val trying = theResponse.toJson
        complete(theResponse)
    }

一个人可以重写此方法以为通用JsonFormat提供T

def apply[T](rawData: T)(implicit formatter: JsonFormat[T])