2012-07-07 11 views
16

Qualcuno sa di un buon tutorial o di un progetto di esempio (github) di utilizzo di Play framework con SLICK (ScalaQuery)? Sto lottando per farli lavorare insieme.Tutorial Play framework + SLICK (Scalaquery)

sto ottenendo questo errore:

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

Ecco il mio modello di libro:

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) 
    } 

} 

EDIT:
Questo è il mio 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

Speculazione: questo sembra un problema di classpath. – pedrofurla

+0

Si prega di mostrare il file Build.scala. –

+0

@nico_ekito, ha aggiornato la mia domanda con Build.scala. – Salil

risposta

7

Modifica Ora che Play2.1 è entrato nel suo processo RC, possiamo usare Slick. Questo perché Play2.1 sta utilizzando Scala2.10 (RC pure) sotto il mare e perché Slick sarà la lib di accesso ai DB predefinita nello stack Typesafe.

Per richiamare, Slick è ora in grado di accedere a RDBMS e sarà presto scelto come target anche per MongoDB. Sta usando un slick (^^) DSL interno per interrogare i backend. Questo DSL è gestito da Macro, ecco perché è richiesto Scala 2.10.

Tuttavia, si noti che il sistema macro è in stato sperimentale (anche quando verrà rilasciato Scala2.10). Non conosco ancora i potenziali avvertimenti di tale stato sul Slick lib nel prossimo futuro.

Per godere di questo RC, andare lì Play2.1RC1, e sfogliare il documento ... ci sono un sacco di cambiamenti là fuori, come l'API JSON f.i.


Hmmmm. Non è sicuro che la chiazza di petrolio funzionerà immediatamente con Play come facile.

Poiché la PLay 2.0 è in realtà costruita su Scala 2.9.x, dove slick richiede 2.10 (per Macro).

Quindi, all'inizio c'è una discrepanza tra i deps che stai dichiarando (slick_2.10.0-M4 sta dicendo che sto usando Scala 2.10.0-M4) e la versione di scala che verrà utilizzata.

BTW, secondo this example site (per Slick) i tuoi SBT sembra ok. Ma potrebbe darsi che il driver abbia bisogno di altri deps (probabilmente AST) e lasci che SBT trovi la versione giusta usando la versione corrente di scala che stai usando (ciò viene fatto dichiarando la dipendenza senza scala versione nel "nome dell'articolazione") = > In questo caso, l'AST non verrà trovato perché non esiste per pre-2.10.

Che cosa potrebbe essere provato è quello di definire un'altra versione di Scala per l'intero progetto ...

mio 2c

+0

"in base a questo sito di esempio" quale sito? – pedrofurla

+0

oops ... lasciatemi correggerli –

+0

fresco, non sapeva Slick aveva il suo repo – pedrofurla

1

Utilizzando Gioca 2.1, con il ultima versione di Slick (1.0.1-RC1), dovresti utilizzare:

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

Sì, quando ho postato questa domanda, non c'erano molte informazioni disponibili. Ora, il repository github di slick contiene esempi sull'integrazione. – Salil