【问题标题】:Play framework + SLICK (Scalaquery) tutorial玩框架+SLICK(Scalaquery)教程
【发布时间】:2012-07-07 22:33:29
【问题描述】:

是否有人知道将 Play 框架与 SLICK (ScalaQuery) 结合使用的好教程或示例项目 (github)?我正在努力让它们一起工作。

我收到此错误:

[info] play - Application started (Dev)
[error] application - 

! @6b13oi41c - Internal server error, for request [GET /listBooks] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1-2.0.2.jar:2.0.2]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1-2.0.2.jar:2.0.2]
    at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor-2.0.2.jar:2.0.2]
    at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1-2.0.2.jar:2.0.2]
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor-2.0.2.jar:2.0.2]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor-2.0.2.jar:2.0.2]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$
    at scala.slick.driver.BasicProfile$class.processAST(BasicProfile.scala:18) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.processAST(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.BasicProfile$class.createQueryBuilder(BasicProfile.scala:22) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.createQueryBuilder(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.BasicProfile$class.buildSelectStatement(BasicProfile.scala:23) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
    at scala.slick.driver.PostgresDriver$.buildSelectStatement(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
[error] application - 

这是我的 Book 模型:

package models

import play.api.db._
import play.api.Play.current

import scala.slick.driver.PostgresDriver.simple._
import scala.slick.ql.{MappedTypeMapper}
import scala.slick.session.{Session, Database}

case class Book(name: String, filename: String)

object Book extends Table[(Long, String, String)]("book") {

  lazy val database = Database.forDataSource(DB.getDataSource())
  def id = column[Long]("id", O PrimaryKey, O AutoInc)
  def name = column[String]("name", O NotNull)
  def filename = column[String]("filename", O NotNull)
  def * = id ~ name ~ filename

  def findAll() : Seq[Book] = database.withSession { implicit db:Session =>
    (for(t <- this) yield t.name ~ t.filename).list.map(attrs => Book(attrs._1, attrs._2))
  }

  def create(book: Book): Unit = database.withSession { implicit db:Session =>
    this.name ~ this.filename insert(book.name, book.filename)
  }

}

编辑:
这是我的 Build.scala

import sbt._
import Keys._
import PlayProject._

object ApplicationBuild extends Build {

    val appName         = "PlayWithScala"
    val appVersion      = "1.0-SNAPSHOT"

    val appDependencies = Seq(
      // Add your project dependencies here,
      "postgresql" % "postgresql" % "9.1-902.jdbc4",
      "com.typesafe" % "slick_2.10.0-M4" % "0.10.0-M2"
    )

    val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here      
    )

}

【问题讨论】:

  • 推测:这看起来像是类路径问题。
  • 请出示您的 Build.scala 文件。
  • @nico_ekito,用 Build.scala 更新了我的问题。
  • @pedrofurla,是的,正如您所见,我对 Scala 和 play 框架都是新手,我不确定 CLASSPATH 中包含哪些目录。
  • 看看这篇博文:blogeek.com.ar/2012/11/24/…

标签: scala playframework-2.0 scalaquery


【解决方案1】:

编辑 现在 Play2.1 已经进入了它的 RC 进程,我们可以使用 Slick。这是因为 Play2.1 在海底使用 Scala2.10(也包括 RC),而且 Slick 将成为 Typesafe 堆栈中的默认数据库访问库。

回想一下,Slick 现在可以访问 RDBMS,并且很快也会针对 MongoDB。它使用光滑的 (^^) 内部 DSL 来查询后端。此 DSL 由宏管理,这就是需要 Scala 2.10 的原因。

但是,请注意,宏系统处于实验状态(即使 Scala2.10 即将发布)。我还不知道在不久的将来 Slick lib 上这种状态的潜在警告。

要享受此 RC,请前往 Play2.1RC1,并浏览文档...那里有很多变化,例如 Json API f.i.


嗯嗯。不确定 slick 是否能像 Play 一样轻松开箱即用。

因为 PLay 2.0 实际上是基于 Scala 2.9.x 构建的,而 slick 需要 2.10(用于宏)。

因此,首先,您声明的部门(slick_2.10.0-M4 说我使用的是 Scala 2.10.0-M4)与将要使用的 scala 版本不匹配。

顺便说一句,根据this example site(对于 Slick),您的 SBT 部门似乎还可以。但是问题可能会出现,驱动程序将需要其他 deps(可能是 AST)并让 SBT 使用您正在使用的当前 scala 版本发现正确的版本(这是通过在“articfact name”中声明没有 scala 版本的依赖关系来完成的)= > 在这种情况下,将找不到 AST,因为它在 2.10 之前的版本中不存在。

可以尝试为整个项目定义另一个版本的 scala...

我的 2c

【讨论】:

  • “根据本例站点”是什么站点?
  • 酷,不知道 Slick 有自己的仓库
  • play 2.1 RC1 使用的是 scala 2.10
【解决方案2】:

使用 Play 2.1,以及最新的 Slick 版本 (1.0.1-RC1),您可以使用:

val appDependencies = Seq(
  "com.typesafe.slick" %% "slick" % "1.0.1-RC1",
  ...
}

【讨论】:

  • 是的,当我发布这个问题时,没有太多可用的信息。现在,slick 的 github 存储库中有关于集成的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2015-07-20
  • 1970-01-01
相关资源
最近更新 更多