Я скопировал код примера Spray Client в свой собственный проект, чтобы он был легко доступен. Я использую IntelliJ 13.

Вот код, который у меня есть:

package mypackage

import scala.util.Success
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.util._
import spray.client.pipelining._
import scala.util.Success
import scala.util.Failure

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

object ElevationJsonProtocol extends DefaultJsonProtocol {
  implicit val locationFormat = jsonFormat2(Location)
  implicit val elevationFormat = jsonFormat2(Elevation)
  implicit def googleApiResultFormat[T :JsonFormat] = jsonFormat2(GoogleApiResult.apply[T])
}

object SprayExample 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...")

  val pipeline = sendReceive ~> unmarshal[GoogleApiResult[Elevation]]

  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()
  }
}

В его нынешнем виде работает отлично и, как и ожидалось, отображается высота Эвереста.
Странная вещь происходит, если я перемещаю файл на один уровень ниже в структуре пакета, то есть создаю mypackage.myinnerpackage и перемещаю файл внутри него.
IDEA изменяет мою первую строку кода на package mypackage.myinnerpackage и все.

Затем я пытаюсь запустить приложение, и компиляция завершится ошибкой со следующим сообщением:

  could not find implicit value for evidence parameter of type spray.httpx.unmarshalling.FromResponseUnmarshaller[courserahelper.sprayexamples.GoogleApiResult[courserahelper.sprayexamples.Elevation]]
  val pipeline = sendReceive ~> unmarshal[GoogleApiResult[Elevation]]
                             ^

Я ничего не менял в коде, я фактически просто изменил пакет! Кроме того, этот код является самодостаточным, он не полагается ни на какие другие неявные выражения, которые я объявил в любой другой части моего кода ....

Что мне не хватает?

Благодарность!

2
mdm 27 Мар 2014 в 19:01

2 ответа

Лучший ответ

(Заменен комментарий этим ответом, который поддерживает правильное форматирование.)

В опубликованном вами коде отсутствуют эти два импорта до использования unmarshal:

 import ElevationJsonProtocol._
 import SprayJsonSupport._
 val pipeline = sendReceive ~> unmarshal[GoogleApiResult[Elevation]]

Которые существуют в исходном коде. IntelliJ иногда возится с импортом, поэтому это может быть причиной того, что они потерялись при переходе.

6
jrudolph 27 Мар 2014 в 19:20
1
Это действительно была проблема! Как вы указали, я мог видеть, что эти два импорта были удалены ... непослушная ИДЕЯ! :) Спасибо!
 – 
mdm
27 Мар 2014 в 19:24
Спасибо, мне тоже помогло. ElevationJsonProtocol больше не нужен/не распознается (спрей-клиент 1.3.2)
 – 
akauppi
11 Май 2016 в 19:18

Вам необходимо предоставить Json Formatter для вашего класса case.

case class Foo(whatever: Option[String])

object FooProtocol extends DefaultJsonProtocol {
  implicit val fooJsonFormat = jsonFormat1(Foo)
}

Затем включите следующее рядом с реализацией ...

import SprayJsonSupport._
import co.xxx.FooProtocol._
0
babalu 26 Фев 2015 в 07:17