Json scala中带有akka编组的泛型返回类型

Json scala中带有akka编组的泛型返回类型,json,scala,generics,akka,spray,Json,Scala,Generics,Akka,Spray,我有以下相当简单的代码: case class InverterResponse(body: InverterBody) extends SolarResponse case class InverterBody(data: InverterData) case class InverterData(dayEnergy: DayEnergy) case class DayEnergy(unit: String, values: Values) case class Values(value: I

我有以下相当简单的代码:

case class InverterResponse(body: InverterBody) extends SolarResponse
case class InverterBody(data: InverterData)
case class InverterData(dayEnergy: DayEnergy)
case class DayEnergy(unit: String, values: Values)
case class Values(value: Int)

case class MeterResponse(body: MeterBody) extends SolarResponse
case class MeterBody(data: MeterData)
case class MeterData(powerRealSum: BigDecimal, powerRealPhase1: BigDecimal, powerRealPhase2: BigDecimal, powerRealPhase3: BigDecimal)

class SolarWebConnector extends JsonSupport {
  implicit val system = ActorSystem()
  implicit val materializer = ActorMaterializer()

  val httpClient = Http().outgoingConnection(host = "192.168.178.22", port = 80)

  def getInverterRealtimeData(): InverterData = {
    val inverterRealtimeURLPath = s"""/solar_api/v1/GetInverterRealtimeData.cgi?scope=System"""
    val flowGet: Future[InverterResponse] = sendRequest[InverterResponse](inverterRealtimeURLPath)
    val start = System.currentTimeMillis()
    val result = Await.result(flowGet, 5 seconds)
    val end = System.currentTimeMillis()
    println(s"Result in ${end - start} millis: $result")
    result.body.data
  }

  private def sendRequest[T](inverterRealtimeURLPath: String) : Future[T] = {
    val flowGet: Future[T] =
      Source.single(
        HttpRequest(
          method = HttpMethods.GET,
          uri = Uri(inverterRealtimeURLPath))
      )
        .via(httpClient)
        .mapAsync(1)(response => Unmarshal(response.entity).to[T])
        .runWith(Sink.head)
    flowGet
  }

  def getMeterRealtimeData(): String = {
    "test"
  }
}
JsonSupport包含json格式定义,用于将传入的json打包到响应案例类中。只要我不试图为sendRequest方法定义一个可以返回InvertorResponse或MeterResponse类型的泛型版本,这种方法就可以正常工作。它编译得很好,但我得到了:

Error:(54, 63) Play 2 Compiler: 
 /Users/tbecker/workspaces/home-integrator/app/services/SolarWebConnector.scala:54:63: could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.Unmarshaller[akka.http.scaladsl.model.ResponseEntity,T]
         .mapAsync(1)(response => Unmarshal(response.entity).to[T])
                                                               ^

我已经有2年没有真正使用scala了……所以我的知识可能有点过时了……

通过在源代码和文档中挖掘自己找到了答案

Umarshall需要一个隐式解组器。在方法签名中提供这样的签名解决了问题:


private def sendRequest[T](invertrrealtimeurlpath:String)(隐式m:Unmarshaller[ResponseEntity,T]):Future[T]={

请注意,隐式Unmarshaller现在被称为
um
而不是
m