2012-04-12 10 views
3

この私の最初のプレイで2.0アプリにキャストすることはできない、とScalaは私にはまだかなり新しいですので、私はおそらくどこかでミスを作ってるんです。私はSalatとCasbahをバンドルしたかなり新しいプラグインを使用しています:https://github.com/leon/play-salatPlay!フレームワーク2.0スカラ - のClassCastException:models.MyModelはmodels.MyModel

私はそれを一般化するために単純化して名前を変更しました。

マイビュー(views/MyController/search.scala.html):

@(modelList:List[models.MyModel]) 
@main(title = "Search MyModel") { 
    <table> 
    @for(a <- modelList) { 
    <tr><td>@a.field<td>@a.field2</li> 
    } 
    </table> 
} 

マイコントローラ(controllers/MyController.scala):

package controllers 

import play.api._ 
import play.api.mvc._ 
import play.api.data._ 
import play.api.data.Forms._ 
import com.mongodb.casbah.Imports._ 
import models._ 

object MyController extends Controller { 
    def search = Action { 
    val modelList = MyModel.all.toList; 
    Ok(views.html.MyController.search(modelList)) 
    } 
} 

マイモデル:(models/MyModel.scala):

package models 

import play.api.Play.current 
import java.util.{Date} 
import com.novus.salat._ 
import com.mongodb.casbah.Imports._ 
import se.radley.plugin.mongodb._ 
import se.radley.plugin.mongodb.salat._ 

case class MyModel(
    id: ObjectId = new ObjectId, 
    field: String, 
    field2: String 
) 

object MyModel extends SalatDAO[MyModel, ObjectId](collection = getCollection("mycollection")) { 
    def all = find(MongoDBObject()) 
} 

そして、私はこれを取得していますエラー:

ClassCastException: models.MyModel cannot be cast to models.MyModel 
私にはあまり意味がありません

- 誰もがこのようなものに遭遇したのか?

のフルスタックトレース:

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[ClassCastException: models.MyModel cannot be cast to models.MyModel]] 
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:82) [play_2.9.1.jar:2.0] 
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:63) [play_2.9.1.jar:2.0] 
at akka.actor.Actor$class.apply(Actor.scala:290) [akka-actor.jar:2.0] 
at play.core.ActionInvoker.apply(Invoker.scala:61) [play_2.9.1.jar:2.0] 
at akka.actor.ActorCell.invoke(ActorCell.scala:617) [akka-actor.jar:2.0] 
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:179) [akka-actor.jar:2.0] 
Caused by: java.lang.ClassCastException: models.MyModel cannot be cast to models.MyModel 
at views.html.MyController.search$$anonfun$apply$1.apply(search.template.scala:25) ~[classes/:na] 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.2] 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194) ~[scala-library.jar:0.11.2] 
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) ~[scala-library.jar:0.11.2] 
at scala.collection.immutable.List.foreach(List.scala:45) ~[scala-library.jar:0.11.2] 
at scala.collection.TraversableLike$class.map(TraversableLike.scala:194) ~[scala-library.jar:0.11.2] 

答えて

3

私はここでの問題は、あなたに、mymodelコレクションオブジェクト

object MyModel extends SalatDAO[MyModel, ObjectId](collection = getCollection("mycollection")) { 
    def all = find(MongoDBObject()) 
} 

があなたのテンプレートにインポートされているものであるということであると思います。

私は次のことをしようとするだろう:

package models 

import play.api.Play.current 
import java.util.{Date} 
import com.novus.salat._ 
import com.mongodb.casbah.Imports._ 
import se.radley.plugin.mongodb._ 
import se.radley.plugin.mongodb.salat._ 

case class MyModel(
    id: ObjectId = new ObjectId, 
    field: String, 
    field2: String 
) 

object MyModelDAO extends SalatDAO[MyModel, ObjectId](collection = getCollection("mycollection")) { 
    def all = find(MongoDBObject()) 
} 

ケースクラスはすでにコンパニオンオブジェクトが付属しています。この場合、MyModelコンパニオンクラスがスカラーによって生成されます。適切にタイプされたSalatDAOを拡張しているオブジェクトもMyModelという名前です。あなたはケースクラスのために生成されたバイトコードと、生成されたクラス名が何であるかを調べるためにMyModel extends SalatDAO[MyModel, ObjectId]クラスを調べなければならないでしょう、私はあなたのケースクラスのためにmodels.MyObject$と思うでしょう。しかし、別の名前を付けると、探している結果が得られるはずです。

+0

ええ、私はそれがコンパニオンオブジェクトで何かだったかもしれない疑いがあるが、一例は、コンフィギュレーションのこの種を示している(https://github.com/leon/play-mongodb/blob/master/sample/app/models/ User.scala)。私はあなたの変更を行い、同じエラーが発生しました - Playを再起動する必要がありました!明らかに、そのようなことを正しく再コンパイルしません。いずれにしても、ありがとう! –

+0

問題ありません。それは簡単な回避策だったのでうれしいです。 –

+0

私はスカラには全く新しいですが、コンパニオンオブジェクトの中にDAOメソッドを置くことは重要ではないと思いました。私はそれがすべて静的なクラスにコンパイルされると思った。私は文書を変更します。 –

関連する問題