2012-04-12 3 views
3

이것은 처음 플레이 한 2.0 응용 프로그램이며 scala는 아직 완전히 새로운 것이므로 어딘가에서 실수를 저 지르려고합니다. 저는 Salat와 Casbah를 번들로 묶은 아주 새로운 플러그인을 사용하고 있습니다. https://github.com/leon/play-salatPlay! Framework 2.0 scala - 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

나는 여기에 문제가

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

이 템플릿에 가져 오는 무엇인가 당신의 MyModel 수집 목적 것으로 생각합니다.

나는 다음을 시도합니다 :

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 동반자 클래스가 자동으로 생성됩니다. 제대로 입력 된 개체 인 SalatDAOMyModel이라는 이름입니다. 케이스 클래스에 대해 생성 된 바이트 코드와 생성 된 클래스 이름이 무엇인지 알아 내기 위해 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 메쏘드를 동반자 객체 안에 넣는 것이 중요 할 것이라고 생각하지 않았다. 나는 그것이 모두 정적 클래스로 컴파일 될 것이라고 생각했다. 나는 문서를 바꿀 것이다. –