Scala 在这个简单的播放示例中,如何使用非托管依赖项?
我正在尝试编写一个Scala Play web服务,该服务返回JSON对象,并且在调用依赖项中的函数时遇到问题。有人能告诉我在这个简化的例子中我做错了什么吗 我有一个名为SimpleJSONAPI的项目,它由以下对象组成Scala 在这个简单的播放示例中,如何使用非托管依赖项?,scala,build,playframework-2.0,Scala,Build,Playframework 2.0,我正在尝试编写一个Scala Play web服务,该服务返回JSON对象,并且在调用依赖项中的函数时遇到问题。有人能告诉我在这个简化的例子中我做错了什么吗 我有一个名为SimpleJSONAPI的项目,它由以下对象组成 package com.github.wpm.SimpleJSONAPI import play.api.libs.json.{JsValue, Json} object SimpleJSONAPI { def toJson(s: String): JsValue =
package com.github.wpm.SimpleJSONAPI
import play.api.libs.json.{JsValue, Json}
object SimpleJSONAPI {
def toJson(s: String): JsValue = Json.toJson(Map("value" -> s))
}
单元测试确认给定一个字符串,它返回一个JSON对象,其形式为{“value”:“string”}
我有一个单独的Play2.2.3Scala项目,我通过键入PlayNewPlayJSON
创建了该项目。我向生成的应用程序中的控制器添加了以下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;
我在一个单元测试中也看到了同样的错误,该测试使用一个FakeRequest
来执行/json
路由
如果我将toJson
函数从外部依赖项复制到Play应用程序中,一切都会正常工作
据我所知,我做的一切都是正确的,错误信息是不透明的。有人能告诉我如何让它工作吗?鉴于您使用API的方式,我认为您的导入是不正确的。在导入时排除对象名称
import com.github.wpm.SimpleJSONAPI._
或者更改用法以删除对象名称
val j = toJson("The JSON API")
这是Scala编译器版本兼容性的问题。我用Scala 2.11编译了我的
SimpleJSONAPI
依赖项,而Play应用程序是用Scala 2.10构建的。当我将SimpleJSONAPI
依赖项更改为也使用Scala 2.10构建时,我能够在我的Play应用程序中使用它
这是令人困惑的,因为从项目文件中看不出Scala a Play app使用的是哪个版本,而且关于
ArrowAssoc
的错误消息没有表明这是编译器版本问题。你说得对。我的导入
行不正确。当我修复它时,我仍然有一个问题。我更新了问题的案文,以反映这一点。