Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 萨拉特磨碎机故障ClassNotFoundException_Mongodb_Scala_Playframework_Salat - Fatal编程技术网

Mongodb 萨拉特磨碎机故障ClassNotFoundException

Mongodb 萨拉特磨碎机故障ClassNotFoundException,mongodb,scala,playframework,salat,Mongodb,Scala,Playframework,Salat,我在Salat方面遇到了一个奇怪的问题,尤其是当我运行PlayWeb应用程序时 以下是stacktrace: Caused by: java.util.concurrent.ExecutionException: Boxed Error at scala.concurrent.impl.Promise$.resolver(Promise.scala:52) ~[scala-library.jar:na] at scala.concurrent.impl.Promise$.scala$concur

我在Salat方面遇到了一个奇怪的问题,尤其是当我运行PlayWeb应用程序时

以下是stacktrace:

Caused by: java.util.concurrent.ExecutionException: Boxed Error
at scala.concurrent.impl.Promise$.resolver(Promise.scala:52) ~[scala-library.jar:na]
at scala.concurrent.impl.Promise$.scala$concurrent$impl$Promise$$resolveTry(Promise.scala:44) ~[scala-library.jar:na]
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:116) [scala-library.jar:na]
... 9 common frames omitted
原因:com.novus.salat.util.GraterGlitch:

  GRATER GLITCH - unable to find or instantiate a grater using supplied path name

  REASON: Very strange!  Path='domain.content.Exam' from pickled ScalaSig causes ClassNotFoundException

  Context: 'global'
  Path from pickled Scala sig: 'domain.content.Exam'



at com.novus.salat.Context$class.lookup(Context.scala:213) ~[salat-core_2.10-1.9.2.jar:1.9.2]
at com.novus.salat.global.package$$anon$1.lookup(global.scala:29) ~[salat-core_2.10-1.9.2.jar:1.9.2]
at com.novus.salat.package$.grater(package.scala:62) ~[salat-core_2.10-1.9.2.jar:1.9.2]
at com.novus.salat.dao.SalatDAO.<init>(SalatDAO.scala:48) ~[salat-core_2.10-1.9.2.jar:1.9.2]
at domain.content.ExamDAO$.<init>(Exam.scala:31) ~[classes/:na]
at domain.content.ExamDAO$.<clinit>(Exam.scala) ~[classes/:na]
at domain.content.Exam$.getAllExamsForTechnology(Exam.scala:22) ~[classes/:na]
at core.ContentService.allExamsForTechnology(ContentService.scala:30) ~[classes/:na]
at controllers.content.ExamController$$anonfun$allExamsForTechnology$1.apply(ExamController.scala:24) ~[classes/:na]
at controllers.content.ExamController$$anonfun$allExamsForTechnology$1.apply(ExamController.scala:22) ~[classes/:na]
at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:221) ~[play_2.10.jar:2.2.1]
at play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:220) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$.invokeBlock(Action.scala:357) ~[play_2.10.jar:2.2.1]
at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:309) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109) ~[play_2.10.jar:2.2.1]
at play.utils.Threads$.withContextClassLoader(Threads.scala:18) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:108) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:107) ~[play_2.10.jar:2.2.1]
at scala.Option.map(Option.scala:145) ~[scala-library.jar:na]
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107) ~[play_2.10.jar:2.2.1]
at play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:100) ~[play_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481) ~[play-iteratees_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$mapM$1.apply(Iteratee.scala:481) ~[play-iteratees_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517) ~[play-iteratees_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM$1.apply(Iteratee.scala:517) ~[play-iteratees_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:493) ~[play-iteratees_2.10.jar:2.2.1]
at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(Iteratee.scala:493) ~[play-iteratees_2.10.jar:2.2.1]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library.jar:na]
... 6 common frames omitted
GRATER故障-无法使用提供的路径名找到或实例化GRATER
理由:很奇怪!pickled ScalaSig中的Path='domain.content.Exam'导致ClassNotFoundException
背景:“全球”
pickled Scala sig的路径:“domain.content.Exam”
在com.novus.salat.Context$class.lookup(Context.scala:213)~[salat-core_2.10-1.9.2.jar:1.9.2]
在com.novus.salat.global.package$$anon$1.lookup(global.scala:29)~[salat-core_2.10-1.9.2.jar:1.9.2]
在com.novus.salat.package$.grater(package.scala:62)~[salat-core_2.10-1.9.2.jar:1.9.2]
在com.novus.salat.dao.SalatDAO.(SalatDAO.scala:48)~[salat-core_2.10-1.9.2.jar:1.9.2]
在domain.content.ExamDAO$(Exam.scala:31)~[classes/:na]
在domain.content.ExamDAO$(Exam.scala)~[classes/:na]
在domain.content.Exam$.getAllExamsForTechnology(Exam.scala:22)~[classes/:na]
在core.ContentService.allExamsForTechnology(ContentService.scala:30)~[classes/:na]
在controllers.content.ExamController$$anonfun$allExamsForTechnology$1.apply(ExamController.scala:24)~[classes/:na]
在controllers.content.ExamController$$anonfun$allExamsForTechnology$1.apply(ExamController.scala:22)~[classes/:na]
在play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:221)~[play_2.10.jar:2.2.1]
在play.api.mvc.ActionBuilder$$anonfun$apply$10.apply(Action.scala:220)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$.invokeBlock(Action.scala:357)~[play_2.10.jar:2.2.1]
在play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:309)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4$$anonfun$apply$5.apply(Action.scala:109)~[play_2.10.jar:2.2.1]
在play.utils.Threads$.withContextClassLoader(Threads.scala:18)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:108)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$4.apply(Action.scala:107)~[play_2.10.jar:2.2.1]
在scala.Option.map(Option.scala:145)~[scala library.jar:na]
在play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:107)~[play_2.10.jar:2.2.1]
在play.api.mvc.Action$$anonfun$apply$1.apply(Action.scala:100)~[play_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$mapM$1.apply(iteratee.scala:481)~[play-iteratees_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$mapM$1.apply(iteratee.scala:481)~[play-iteratees_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$flatMapM$1.apply(iteratee.scala:517)~[play-iteratees_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$flatMapM$1.apply(iteratee.scala:517)~[play-iteratees_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(iteratee.scala:493)~[play-iteratees_2.10.jar:2.2.1]
在play.api.libs.iteratee.iteratee$$anonfun$flatMap$1$$anonfun$apply$13.apply(iteratee.scala:493)~[play-iteratees_2.10.jar:2.2.1]
在scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)[scala library.jar:na]
在scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)[scala library.jar:na]
... 省略了6个公共框架

这个奇怪错误的原因是什么?

我添加了一个自定义包对象,如下所示:

import com.novus.salat.Context
import play.api.Play

package object CustomPlaySalatContext {
  implicit val ctx = new Context {
    val name = "Custom_Classloader"
  }
  ctx.registerClassLoader(Play.classloader(Play.current))
}

在DAO对象中导入上面的包,问题就消失了

我在Play 2.4.x中遇到了同样的问题。但sparkr的解决方案还不够,因为Play会在每次代码更改时不断创建新的类加载器。以下黑客(在
Globals.scala
中)似乎解决了这个问题:

import play.api.{Play, Application, GlobalSettings}
import com.novus.salat.global.{ctx => SalatGlobalContext}

object Global extends GlobalSettings {
  override def onStart(app: Application) = {
    SalatGlobalContext.clearAllGraters()
    SalatGlobalContext.registerClassLoader(Play.classloader(Play.current))
  }
}

我使用的是SalatCore1.9.2、Casbah2.5.1和Scala2.10。我能做些什么来消除这个错误?有了这个方法,似乎还有另一个问题。我不能再对我的实体进行单元测试了。原因是它需要一个播放应用程序启动并运行。这是一个非常丑陋的解决方案,原因是我将我的DAO类与一个UI/REST框架(如Play)绑定在一起。我可能会考虑使用卡斯巴,没有萨拉河!有一种在Play中运行假的应用程序的方法,我也遇到过这种情况。但是我不喜欢在数据库层上使用playapi的想法。我来自JavaEE背景,是松耦合设计原理的铁杆粉丝。