将 SORM 与 Play Framework 一起使用会导致引发反射异常
Posted
技术标签:
【中文标题】将 SORM 与 Play Framework 一起使用会导致引发反射异常【英文标题】:Using SORM with Play Framework causes reflection exceptions to be thrown 【发布时间】:2013-06-04 19:25:01 【问题描述】:我一直在尝试让 SORM 与 Play Framework 2.2-SNAPSHOT 以及 2.1.1 一起使用。目前,我正在尝试运行我创建的简约示例应用程序,以便更轻松地跟踪问题。不幸的是,我收到的错误消息对我没有任何帮助。
val appDependencies = Seq(
"org.sorm-framework" % "sorm" % "0.3.8",
"com.h2database" % "h2" % "1.3.168"
)
# Database configuration
#
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
# db.default.user=sa
# db.default.password=""
case class Car( brand: String, wheels: Int )
object Db extends Instance( Seq( Entity[Car]() ), "jdbc:h2:mem:play" )
object Application extends Controller
def index = Action
Db.query[Car].count()
Ok("hello wolrd")
此堆栈跟踪中的结果:
play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoSuchMethodError: scala.reflect.internal.TreeInfo.firstArgument(Lscala/reflect/internal/Trees$Tree;)Lscala/reflect/internal/Trees$Tree;]]
at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1]
at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) [play_2.10.jar:2.1.1]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) [play_2.10.jar:2.1.1]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1]
java.lang.RuntimeException: java.lang.NoSuchMethodError: scala.reflect.internal.TreeInfo.firstArgument(Lscala/reflect/internal/Trees$Tree;)Lscala/reflect/internal/Trees$Tree;
at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:222) ~[play_2.10.jar:2.1.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1]
at play.utils.Threads$.withContextClassLoader(Threads.scala:18) ~[play_2.10.jar:2.1.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:108) ~[play_2.10.jar:2.1.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:106) ~[play_2.10.jar:2.1.1]
Caused by: java.lang.NoSuchMethodError: scala.reflect.internal.TreeInfo.firstArgument(Lscala/reflect/internal/Trees$Tree;)Lscala/reflect/internal/Trees$Tree;
at scala.tools.nsc.typechecker.Typers$Typer.parentTypes(Typers.scala:1550) ~[scala-compiler.jar:na]
at scala.tools.nsc.typechecker.Namers$Namer.templateSig(Namers.scala:861) ~[scala-compiler.jar:na]
at scala.tools.nsc.typechecker.Namers$Namer.getSig$1(Namers.scala:1300) ~[scala-compiler.jar:na]
at scala.tools.nsc.typechecker.Namers$Namer.typeSig(Namers.scala:1347) ~[scala-compiler.jar:na]
at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply$mcV$sp(Namers.scala:709) ~[scala-compiler.jar:na]
at scala.tools.nsc.typechecker.Namers$Namer$$anonfun$monoTypeCompleter$1$$anonfun$apply$1.apply(Namers.scala:708) ~[scala-compiler.jar:na]
【问题讨论】:
看起来像二进制兼容性问题。 我确认这个问题。开始修复它。 经过数小时令人沮丧的试验和错误之后听到的消息真是太美妙了。感谢您处理此问题(: 已打开 a ticket。同时请尝试以前的版本"com.github.nikita-volkov" % "sorm" % "0.3.7"
(注意不同的工件组)并报告。它应该工作正常。
【参考方案1】:
好的。这不是一个错误。 SORM 0.3.8 依赖于 Scala 2.10.1 而 Play 2.1.x 使用 Scala 2.10.0。您得到的异常是由 Play 混合来自两个 Scala 版本的工件引起的。
要解决此问题,您只需告诉 Play 使用正确的 Scala 版本,方法是将 scalaVersion := "2.10.1"
添加到文件中的项目设置中项目/Build.scala.
最终的构建脚本可能如下所示:
object ApplicationBuild extends Build
val appName = "play-test"
val appVersion = "1.0-SNAPSHOT"
val appDependencies = Seq(
"org.sorm-framework" % "sorm" % "0.3.8",
"com.h2database" % "h2" % "1.3.168"
)
val main = play.Project(appName, appVersion, appDependencies).settings(
resolvers +=
"Local Maven Repository" at
"file:///"+Path.userHome.absolutePath+"/.m2/repository",
scalaVersion := "2.10.1" // <--- ! This is the fix !
)
【讨论】:
2.10.1 应该是 2.10.0 的替代品。您能否详细说明导致异常的确切原因?更新。好吧,没关系,我现在明白了。 @EugeneBurmako 这更像是一个猜测。经过深思熟虑,我现在认为这可能是由于 Play 可能不依赖 scala-reflect 或 scala-compiler 而 SORM 目前确实同时具有这两者,所以结果可能是 Play 将 scala-library-2.10.0 与 scala-reflect-2.10.1 或类似的东西混合在一起。你怎么看? 不幸的是,当我尝试fetch
一个元素时,我仍然收到 RuntimeException。 ClassCastException: __wrapper$1$8dcf00bfeb4549a397715a02daf05008.__wrapper$1$8dcf00bfeb4549a397715a02daf05008$PersistedAnonymous10$1 cannot be cast to [my class]
。但是,现在可以保存项目或计数。
@Taig Fetching 对我来说效果很好。您的代码中可能有错误。您可以提出一个新问题。
@NikitaVolkov 堆栈跟踪来自哪里?是来自Sorm执行的运行时编译吗?以上是关于将 SORM 与 Play Framework 一起使用会导致引发反射异常的主要内容,如果未能解决你的问题,请参考以下文章
如何将 IntelliJ 与 Play Framework 和 Scala 一起使用