2012-07-07 104 views
16

是否有人知道使用SLICK(ScalaQuery)的Play框架的好教程或示例項目(github)?我正在努力讓他們一起工作。玩框架+ SLICK(Scalaquery)教程

我收到此錯誤:

[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 - 

這裏是我的書型號:

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  
    ) 

} 
+0

猜測:這看起來像一個類路徑問題。 – pedrofurla 2012-07-08 06:05:21

+0

請顯示您的Build.scala文件。 – 2012-07-08 07:26:01

+0

@nico_ekito,用Build.scala更新了我的問題。 – Salil 2012-07-08 07:49:48

回答

7

編輯 現在Play2.1已經進入RC過程,我們可以使用Slick。這是因爲Play2.1在海底使用Scala2.10(RC),因爲Slick將成爲Typesafe堆棧中的默認DB訪問庫。

回想起來,Slick現在可以訪問RDBMS,並且很快也會以MongoDB爲目標。它使用光滑的(^^)內部DSL來查詢後端。這個DSL由宏管理,這就是爲什麼Scala 2.10是必需的。

但是,請注意宏系統處於實驗狀態(即使Scala2.10將被釋放)。我不知道在不久的將來Slick lib中這種狀態的潛在警告。

要享受這個RC,去那裏Play2.1RC1,並瀏覽文檔...有很多的變化,像Json API f.i.


嗯。不確定光滑會如何輕鬆地使用Play即可使用。

因爲PLay 2.0實際上建立在Scala 2.9.x上,其中slick需要2.10(對於Macro)。

所以,首先你聲明的折扣(slick_2.10.0-M4是說我正在使用Scala 2.10.0-M4)和將要使用的scala版本之間不匹配。

順便說一句,根據this example site(Slick)你的SBT代價似乎沒問題。但問題可能出現在驅動程序需要其他代碼(可能是AST),並讓SBT使用當前使用的scala版本發現正確的版本(這是通過在「articfact name」中聲明不帶scala版本的依賴關係來完成的)= >這種情況下,AST不會被發現,因爲它在2.10之前不存在。

什麼可以嘗試是定義階的另一個版本對整個項目...

我2C

+0

「根據這個例子網站」什麼網站? – pedrofurla 2012-07-08 19:21:54

+0

哎呀...讓我改正它 – 2012-07-08 20:22:26

+0

酷,不知道斯利克有它自己的回購 – pedrofurla 2012-07-08 21:09:24

1

使用播放2.1,與最新的Slick版本(1.0.1-RC1),你會用:

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

是的,當我發佈這個問題時,沒有太多可用的信息。現在,浮油的github回購有關於整合的例子。 – Salil 2013-05-20 02:40:31