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