首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Play framework + SLICK (Scalaquery)教程

Play framework + SLICK (Scalaquery)教程
EN

Stack Overflow用户
提问于 2012-07-08 07:50:09
回答 2查看 13.8K关注 0票数 16

有没有人知道使用Play框架和SLICK (ScalaQuery)的好教程或示例项目(github)?我正在努力让他们一起工作。

我得到了这个错误:

代码语言:javascript
复制
[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模型:

代码语言:javascript
复制
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

代码语言:javascript
复制
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      
    )

}
EN

回答 2

Stack Overflow用户

发布于 2012-07-09 00:10:16

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

回想一下,Slick现在可以访问关系型数据库管理系统了,而且很快就会把MongoDB作为目标。它使用一个巧妙的(^^)内部DSL来查询后端。这个DSL是由Macros管理的,这就是为什么需要Scala2.10的原因。

但是,请注意,宏系统处于实验状态(即使Scala2.10将发布)。我还不知道这样的地位在不久的将来会对光鲜的lib有什么潜在的警告。

要享受此RC,请转到Play2.1RC1,并浏览文档...有很多变化,比如Json API f.i.。

嗯。我不确定slick会不会像Play一样简单地工作。

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

所以,一开始在你声明的dep (slick_2.10.0-M4说我使用的是Scala 2.10.0-M4)和将要使用的scala版本之间存在不匹配。

顺便说一句,根据this example site (油滑的意思),你的SBT deps看起来还不错。但问题可能来了,驱动程序将需要其他deps (可能是AST ),并让SBT使用您正在使用的当前scala版本发现正确的版本(这是通过声明依赖项来完成的,而不是在“文章名称”中声明scala版本) =>这种情况下,将找不到AST,因为它在2.10之前的版本中不存在。

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

我的2c

票数 7
EN

Stack Overflow用户

发布于 2013-05-19 09:40:27

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

代码语言:javascript
复制
val appDependencies = Seq(
  "com.typesafe.slick" %% "slick" % "1.0.1-RC1",
  ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11379608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档