【问题标题】:Play! framework 2.0 scala - ClassCastException: models.MyModel cannot be cast to models.MyModel玩!框架 2.0 scala - ClassCastException:models.MyModel 无法转换为 models.MyModel
【发布时间】:2012-04-25 08:08:51
【问题描述】:

这是我的第一个 play 2.0 应用程序,scala 对我来说仍然很新,所以我很可能在某个地方犯了错误。我正在使用一个非常新的插件,它捆绑了 Salat 和 Casbah:https://github.com/leon/play-salat

我已经简化并重命名了所有内容以使其通用。

我的看法(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]

【问题讨论】:

    标签: scala mongodb playframework playframework-2.0 salat


    【解决方案1】:

    我认为这里的问题是您的 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())
    }
    

    案例类已经带有伴随对象。在这种情况下,scala 会为您生成一个 MyModel 伴随类。扩展正确类型的SalatDAO 的对象也被命名为MyModel。您将不得不查看为案例类和MyModel extends SalatDAO[MyModel, ObjectId] 类生成的字节码以找出生成的类名是什么,我认为您的案例类将是models.MyObject$。但是,如果您以不同的方式命名它,那么您应该会得到您正在寻找的结果。

    【讨论】:

    • 是的,我怀疑它可能与伴随对象有关,但示例显示了这种配置 (github.com/leon/play-mongodb/blob/master/sample/app/models/…)。我做了你的改变,得到了同样的错误——最终需要重新启动 Play!,显然它没有正确重新编译那种东西。无论如何,非常感谢!
    • 我的错,我对 scala 还很陌生,我认为将 DAO 方法放在伴生对象中并不重要。我认为这一切都会被编译成一个静态类。我将更改文档。
    • 我猜问题是伴随对象扩展了 SalatDAO。当然,您可以将内容放入案例类伴生对象中,但它通常不会扩展任何内容。
    • 我不确定发生错误的确切原因。案例类伴生对象可以扩展已存在的同名对象——预定义对象只是从生成的案例类伴生对象中接收必要的应用和取消应用方法。我认为这实际上可能与 SalatDAO 是通用类型的事实有关。我会进一步调查此事,再考虑一下,然后再回复你。
    • 是的,修复是暂时的。每次更改视图或模型文件时,我都需要重新开始播放以使其再次运行。
    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 2012-12-17
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多