我已将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()
}
}
目前,完美无缺,并按预期印刷了Mt.Everest的高度。
如果我将文件在包结构中向下移动一级,就会发生奇怪的事情,即创建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]]
^
我没有更改代码中的任何内容,我实际上只是更改了包!另外,这段代码是自包含的,它不依赖于我在代码的任何其他部分声明的任何其他隐式....
我错过了什么?
谢谢!
答案 0 :(得分:6)
(替换了这个支持正确格式化的答案的评论。)
在使用unmarshal
之前,您发布的代码缺少这两项导入:
import ElevationJsonProtocol._
import SprayJsonSupport._
val pipeline = sendReceive ~> unmarshal[GoogleApiResult[Elevation]]
存在于原始代码中。 IntelliJ有时会搞乱进口,这可能是他们在转型中迷失的原因。
答案 1 :(得分:0)
您需要为案例类提供Json Formatter。
case class Foo(whatever: Option[String])
object FooProtocol extends DefaultJsonProtocol {
implicit val fooJsonFormat = jsonFormat1(Foo)
}
然后在实施附近包括以下内容......
import SprayJsonSupport._
import co.xxx.FooProtocol._