我正在尝试编写一个Scala Play Web服务,该服务返回JSON对象,但在依赖项中调用函数时遇到问题。有人可以告诉我在这个简化的例子中我做错了吗?
我有一个名为SimpleJSONAPI的项目,它包含以下对象。
package com.github.wpm.SimpleJSONAPI
import play.api.libs.json.{JsValue, Json}
object SimpleJSONAPI {
def toJson(s: String): JsValue = Json.toJson(Map("value" -> s))
}
单元测试确认给定一个字符串它返回一个{"value":"string"}
形式的JSON对象。
我通过键入play new PlayJSON
创建了一个单独的Play 2.2.3 Scala项目。我在生成的应用程序中向控制器添加了以下json
操作。
package controllers
import play.api.mvc._
import com.github.wpm.SimpleJSONAPI._
object Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
def json = {
val j = SimpleJSONAPI.toJson("The JSON API")
Action {
Ok(j)
}
}
}
我也添加了这条路线。
GET /json controllers.Application.json
在PlayJSON项目的根目录中,我有一个lib目录,其中包含SimpleJSONAPI构建的simplejsonapi_2.11.jar
。这似乎包含正确的代码。
> jar tf lib/simplejsonapi_2.11.jar
META-INF/MANIFEST.MF
com/
com/github/
com/github/wpm/
com/github/wpm/SimpleJSONAPI/
com/github/wpm/SimpleJSONAPI/SimpleJSONAPI$.class
com/github/wpm/SimpleJSONAPI/SimpleJSONAPI.class
这是编译,但是当我尝试连接到localhost:9000/json
时,我在val j
分配的行中遇到以下运行时错误。
java.lang.NoSuchMethodError: scala.Predef$.ArrowAssoc(L/java/lang/Object;)Ljava/lang/Object;
我在使用/json
行使FakeRequest
路线的单元测试中也看到同样的错误。
如果我将toJson
函数从外部依赖项复制到Play应用程序中,一切正常。
据我所知documentation我做的一切正确,错误信息是不透明的。有人能告诉我如何让它发挥作用吗?
答案 0 :(得分:0)
考虑到您使用API的方式,我认为您的导入不正确。在导入...上排除对象名称
import com.github.wpm.SimpleJSONAPI._
或者更改您的使用情况以删除对象名称...
val j = toJson("The JSON API")
答案 1 :(得分:0)
这是Scala编译器版本兼容性的问题。我使用Scala 2.11编译了我的SimpleJSONAPI
依赖项,而使用Scala 2.10构建了Play应用程序。当我将SimpleJSONAPI
依赖项更改为使用Scala 2.10构建时,我能够在我的Play应用程序中使用它。
这很令人困惑,因为从项目文件中可以看出哪个版本的Scala Play应用程序正在使用,而且ArrowAssoc
的错误消息并未表明它是编译器版本问题。