2

Play 2.1.0 (Scala) フレームワーク アプリケーションがあり、Salat を使用してケース クラス オブジェクトを MongoDBObjects に変換しようとしています。Play コンソールを起動し、ケース クラスの 1 つをインスタンス化し、salat._ と salat.global._ をインポートすると、ケース クラスから MongoDBObject に変換できます。

プレイ中の「実行」モードで、同じコードを実行してケース クラスから MongoDBObject に変換するアクターを呼び出すページを呼び出すと、エラーが発生します (data.Field はケース クラスの完全な名前です)。 :

com.novus.salat.util.GraterGlitch:

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

名前

  REASON: Very strange!  Path='data.Field' from pickled ScalaSig causes Clas

sNotFoundException

  Context: 'global'
  Path from pickled Scala sig: 'data.Field'

ここで別の質問に答えて、プロジェクトの依存関係に scala-compiler を追加しましたが、役に立ちませんでした。

私を悩ませているのは、これが手動でインスタンス化するコンソールではうまく機能するが、フルプレイアプリを実行すると失敗することです。

ここで何か助けていただければ幸いです。

編集: scala コンパイラを依存関係に追加し、「play start」を使用すると正常に動作します。「play run」を使用すると、上記のエラーを使用して惨めに失敗します。理由についての洞察は役に立ちます。

4

1 に答える 1

3

https://github.com/playframework/Play20/issues/822によると、これは動的クラスローダーが原因です。

私の場合、このコードで問題が解決しました。

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

https://github.com/novus/salat/wiki/CustomContextも参照して ください

于 2013-07-09T07:33:08.783 に答える