2013-12-21 6 views
3

Salat과 관련된 이상한 문제가 있습니다. 특히 Play 웹 응용 프로그램을 실행할 때 발생합니다. com.novus.salat.util.GraterGlitch :Salat GRATER GLITCH ClassNotFoundException

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 

에 의해 발생 :

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 

이 이상한 오류의 원인은 무엇인가 여기

는 스택 트레이스입니까?

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 객체의 패키지와 문제가 지금 사라 :

+0

저는 salat-core 1.9.2, casbah 2.5.1 및 scala 2.10을 사용하고 있습니다. 이 오류를 없애기 위해 내가 할 수있는 제안은 무엇입니까? – sparkr

답변

2

나는 다음과 같은 사용자 정의 패키지 개체를 추가!

+1

이 접근법에는 또 다른 문제가있는 것으로 보입니다. 더 이상 엔티티를 단위 테스트 할 수 없습니다. 그 이유는 Play 애플리케이션을 실행해야한다는 것입니다. 이것은 극히 추악한 해결 방법입니다. 이유는 Play와 같은 UI/REST 프레임 워크로 DAO 클래스를 묶는 것입니다. 나는 Salat없이 Casbah를 사용하는 것을 고려할지도 모른다! – sparkr

+0

거기에는 가짜 응용 프로그램을 실행하는 방법이 있습니다. –

+1

나는 그 점을 발견했습니다. 그러나 나는 데이터베이스 레이어에서 Play API를 사용하는 것을 좋아하지 않는다. 나는 Java EE 배경에서 왔고 느슨한 커플 링 디자인 원리에 대한 열렬한 팬이다. – sparkr

2

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)) 
    } 
}