无法使用spray-json解组json HttpEntity

4

我正在尝试运行文档中的简单示例,与原始代码相同:

文档
import spray.json.DefaultJsonProtocol
import spray.httpx.unmarshalling._
import spray.httpx.marshalling._
import spray.http._
import HttpCharsets._
import MediaTypes._

case class Person(name: String, firstName: String, age: Int)

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit val PersonFormat = jsonFormat3(Person)
}

import MyJsonProtocol._
import spray.httpx.SprayJsonSupport._
import spray.util._

val bob = Person("Bob", "Parr", 32)
val body = HttpEntity(
  contentType = ContentType(`application/json`, `UTF-8`),
  string =
"""|{
  |  "name": "Bob",
  |  "firstName": "Parr",
  |  "age": 32
  |}""".stripMarginWithNewline("\n")
)

marshal(bob)
body.as[Person]

在最后一行 ("body.as[Person]") 失败,出现以下错误和堆栈跟踪:

Exception in thread "main" java.lang.NoSuchMethodError: spray.json.JsonParser$.apply(Ljava/lang/String;)Lspray/json/JsValue;
    at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:36)
    at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:34)
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
    at spray.httpx.unmarshalling.Unmarshaller$$anon$1$$anonfun$unmarshal$1.apply(Unmarshaller.scala:29)
    at spray.httpx.unmarshalling.SimpleUnmarshaller.protect(SimpleUnmarshaller.scala:40)
    at spray.httpx.unmarshalling.Unmarshaller$$anon$1.unmarshal(Unmarshaller.scala:29)
    at spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:29)
    at spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:23)
    at spray.httpx.unmarshalling.package$PimpedHttpEntity.as(package.scala:39)
    at com.example.M1$.delayedEndpoint$com$example$M1$1(M1.scala:34)
    at com.example.M1$delayedInit$body.apply(M1.scala:3)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.App$$anonfun$main$1.apply(App.scala:76)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
    at scala.App$class.main(App.scala:76)
    at com.example.M1$.main(M1.scala:3)
    at com.example.M1.main(M1.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

我的代码有什么问题?我的依赖关系如下(build.sbt):
scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
  "io.spray" %% "spray-can" % "1.3.1",
  "io.spray" %% "spray-routing" % "1.3.1",
  "io.spray" %% "spray-json" % "1.3.2",
  "com.typesafe.akka" %% "akka-actor" % "2.3.11"
)

我发现了一个涉及spray-httpx和spray-json不兼容的bug,但看起来这个问题已经得到解决。我正在使用所有库的最新稳定版本。
还有什么其他问题可能存在呢?

似乎版本存在问题...您为什么要在span-can、spray-routing中使用1.3.1,而在spray-json中使用1.3.2? - mericano1
顺便问一下,你为什么认为1.3.1是最新版本呢?我们遇到了几个类似的问题,也许有一个旧的源代码可以解决这个问题?(首先,我们应该确保不破坏兼容性,但不幸的是我们搞混了) - jrudolph
我之前以为1.3.1是最新版本,因为我使用了http://mvnrepository.com/搜索。 :) 请查看http://mvnrepository.com/artifact/io.spray/spray-can/1.3.1那是我的错误。我现在知道这不是搜索Java/Scala依赖库的最佳选择。 - pkozlov
1个回答

6

看起来是spray-http和spray-json之间版本不兼容的问题,这些特定版本可以很好地配合使用而没有任何问题:

libraryDependencies ++= Seq(
  "io.spray" %% "spray-can" % "1.3.3",
  "io.spray" %% "spray-routing" % "1.3.3",
  "io.spray" %% "spray-json" % "1.3.2",
  "com.typesafe.akka" %% "akka-actor" % "2.3.11"
)

非常感谢!这就是我头痛的原因! :) 我选择1.3.1版本的spray-can和spray-routing的原因是,这是mvnrepository.com搜索引擎给我的最新版本。再也不会相信这个网站了。 :) - pkozlov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接