2012-07-07 12 views
16

¿Alguien sabe de un buen tutorial o un proyecto de muestra (github) del uso de Play framework con SLICK (ScalaQuery)? Estoy luchando para que funcionen juntos.Marco de juego + tutorial SLICK (Scalaquery)

estoy recibiendo este error:

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

Aquí es mi modelo del 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:
Este es mi 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

Especulación: esto parece un problema de classpath. – pedrofurla

+0

Por favor, muestre su archivo Build.scala. –

+0

@nico_ekito, actualicé mi pregunta con Build.scala. – Salil

Respuesta

7

Editar Ahora que Play2.1 ha ingresado a su proceso RC, podemos usar Slick. Eso es porque Play2.1 está usando Scala2.10 (RC también) debajo del mar y porque Slick será la lib de acceso de base de datos predeterminada en la pila Typesafe.

Para recordar, Slick ahora puede acceder a RDBMS, y también se dirigirá pronto a MongoDB. Se está utilizando una DSL interna (^^) para consultar backends. Este DSL está gestionado por Macros, por eso se requiere Scala 2.10.

Sin embargo, tenga en cuenta que el sistema macro está en estado experimental (incluso cuando se lanzará Scala2.10). Todavía no sé las advertencias potenciales de tal estado en Slick lib en el futuro cercano.

Para disfrutar este RC, vaya allí Play2.1RC1, y busque en el documento ... hay muchos cambios, como el Json API f.i.


Hmmmm. No estoy seguro de que la mancha funcione de la caja con Play tan fácil.

Porque PLay 2.0 en realidad se basa en Scala 2.9.x, donde slick requiere 2.10 (para Macro).

Por lo tanto, al principio hay una falta de coincidencia entre los detalles que está declarando (slick_2.10.0-M4 está diciendo que estoy usando Scala 2.10.0-M4) y la versión scala que se utilizará.

Por cierto, de acuerdo con this example site (para Slick) su SBT deps parece estar bien. Pero podría surgir el problema de que el controlador requiera otros déficits (AST probablemente) y deje que SBT descubra la versión correcta utilizando la versión scala actual que está utilizando (esto se hace declarando la dependencia sin la versión scala en el "nombre del artículo") = > En este caso, el AST no se encontrará porque no existe para pre-2.10.

Qué podría ser juzgado es definir otra versión de Scala para todo el proyecto ...

Mi 2c

+0

"de acuerdo con este sitio de ejemplo" ¿qué sitio? – pedrofurla

+0

oops ... déjame corregirlo –

+0

Genial, no sabía Slick tenía su propio repo – pedrofurla

1

2.1 Uso de la reproducción, con el la última versión de Slick (1.0.1-RC1), usaría:

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

Sí, cuando publiqué esta pregunta, no había mucha información disponible. Ahora, el informe github de slick tiene ejemplos sobre la integración. – Salil

Cuestiones relacionadas