Недостаточно аргументов для демаршалирования метода: (неявное свидетельство $1: spray.httpx.unmarshalling.FromResponseUnmarshaller

Я перехожу от SprayJsonSupport к argonaut на основе этот пример. После некоторой модификации кода:

object ElevationJsonProtocol extends DefaultJsonProtocol {
  implicit val locationCodec: CodecJson[Elevation] = casecodec2(Elevation, Elevation.unapply)("location", "elevation")
  implicit val elevationCodec: CodecJson[Location] = casecodec2(Location, Location.unapply)("lat", "lng")
  implicit def googleApiResultCodec: CodecJson[GoogleApiResult] = casecodec2(GoogleApiResult, GoogleApiResult.unapply)("status", "results")
}

я получил эту ошибку

Ошибка: (41, 42) недостаточно аргументов для демаршалирования метода: (неявное свидетельство $1: spray.httpx.unmarshalling.FromResponseUnmarshaller[GoogleApiResult])spray.http.HttpResponse => GoogleApiResult. Свидетельство параметра неопределенного значения $1. val pipe = sendReceive ~> unmarshal[GoogleApiResult] ^

Я смотрю на метод unmarshall:

 def unmarshal[T](implicit evidence$1 : spray.httpx.unmarshalling.FromResponseUnmarshaller[T]) : scala.Function1[spray.http.HttpResponse, T] 

Как я могу добавить неявный параметр? и почему я не получил такой ошибки с помощью sprayJsonSupport?

Код отверстия:

import spray.httpx.unmarshalling.FromResponseUnmarshaller

import scala.util.{Success, Failure}
import scala.concurrent.duration._
import akka.actor.ActorSystem
import akka.pattern.ask
import akka.event.Logging
import akka.io.IO
import spray.json.{JsonFormat, DefaultJsonProtocol}
import spray.can.Http
import spray.httpx.SprayJsonSupport
import spray.client.pipelining._
import spray.util._
import argonaut._, Argonaut._

case class Elevation(location: Location, elevation: Double)
case class Location(lat: Double, lng: Double)
case class GoogleApiResult(status: String, results: List[Elevation])

object ElevationJsonProtocol extends DefaultJsonProtocol {
  implicit val locationCodec: CodecJson[Elevation] = casecodec2(Elevation, Elevation.unapply)("location", "elevation")
  implicit val elevationCodec: CodecJson[Location] = casecodec2(Location, Location.unapply)("lat", "lng")
  implicit def googleApiResultCodec: CodecJson[GoogleApiResult] = casecodec2(GoogleApiResult, GoogleApiResult.unapply)("status", "results")
}

object Main extends App {
  // we need an ActorSystem to host our application in
  implicit val system = ActorSystem("simple-spray-client")
  import system.dispatcher // execution context for futures below
  val log = Logging(system, getClass)

  log.info("Requesting the elevation of Mt. Everest from Googles Elevation API...")

  import ElevationJsonProtocol._

  val pipeline = sendReceive ~> unmarshal[GoogleApiResult]

  val responseFuture = pipeline (
    Get("http://maps.googleapis.com/maps/api/elevation/json?locations=27.988056,86.925278&sensor=false")
    )

  responseFuture onComplete {
    case Success(GoogleApiResult(_, Elevation(_, elevation) :: _)) =>
      log.info("The elevation of Mt. Everest is: {} m", elevation)
      shutdown()

    case Success(somethingUnexpected) =>
      log.warning("The Google API call was successful but returned something unexpected: '{}'.", somethingUnexpected)
      shutdown()

    case Failure(error) =>
      log.error(error, "Couldn't get elevation")
      shutdown()
  }

  def shutdown(): Unit = {
    IO(Http).ask(Http.CloseAll)(1.second).await
    system.shutdown()
  }
}

person SaKou    schedule 19.02.2016    source источник


Ответы (1)


На самом деле я не использую argonaut, я использую play json со спреем. Но на первый взгляд кажется, что для ваших неявных кодеков должна быть включена черта / импорт поддержки argonaut для преобразования в unmarshaller спрея (аналогичная вещь требуется для воспроизведения json).

https://github.com/dwhjames/argonaut-spray

эта библиотека, кажется, то, что вы хотите. Ваши имплициты и импорты выглядят нормально, использование библиотеки должно решить вашу проблему.

person yogiHulk    schedule 20.02.2016