什么是在akka-http Scala中向spray-json-support注册泛型类型的正确方法?

3

所以,我有这个类:

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个回答

5

你看,这里没有为你的 T 准备 JsonFormat 的存在证据:

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

可以重写这个方法,为通用的 T 提供JsonFormat

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

谢谢回答 :) 但是,我得到了一个新的错误,它说无法找到Something[_1]的JsonWriter或JsonFormat类型类 - Enki Probo
嗯,_1 是什么类型?你有它的 JsonFormat 吗?此外,你可以提供一个最小可复现的代码示例,以便我或其他人可以查看。 - Yevhenii Popadiuk
哇,非常感谢 @Yevhenii Popadiuk。抱歉,实际上我在 Something 中有 2 个字段,就像这样 case class Something[T](data: Option[T] = None, meta: Option[String] = None).. 在最后的代码中,我有这样的语句 val theResponse = if (blabla) Something(data = Some(data)) else Something(meta = Some(meta)),这就是问题所在。我应该进行显式的赋值.. 嘿嘿,非常感谢 :) - Enki Probo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接