Игровой фреймворк + учебник SLICK (Scalaquery)

Кто-нибудь знает хороший учебник или пример проекта (github) использования Play framework с 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      
    )

}

person Salil    schedule 07.07.2012    source источник
comment
Предположение: это похоже на проблему пути к классам.   -  person pedrofurla    schedule 08.07.2012
comment
Пожалуйста, покажите свой файл Build.scala.   -  person ndeverge    schedule 08.07.2012
comment
@nico_ekito, обновил мой вопрос с помощью Build.scala.   -  person Salil    schedule 08.07.2012
comment
@pedrofurla, да, как видите, я новичок как в Scala, так и в игровой среде, и я не уверен, какие каталоги включены в CLASSPATH.   -  person Salil    schedule 08.07.2012
comment
Взгляните на этот пост в блоге: blogeek.com.ar/2012/11/24/   -  person Somatik    schedule 25.11.2012


Ответы (2)


Редактировать Теперь, когда Play2.1 вступил в процесс RC, мы можем использовать Slick. Это связано с тем, что Play2.1 использует Scala2.10 (также RC) под водой и потому что Slick будет библиотекой доступа к БД по умолчанию в стеке Typesafe.

Напомним, что Slick теперь может получить доступ к СУБД и вскоре также будет нацелен на MongoDB. Он использует гладкий (^^) внутренний DSL для запросов к бэкендам. Этот DSL управляется макросами, поэтому требуется Scala 2.10.

Однако обратите внимание, что система макросов находится в экспериментальном состоянии (даже когда будет выпущен Scala 2.10). Я еще не знаю потенциальных предостережений такого статуса в библиотеке Slick в ближайшем будущем.

Чтобы насладиться этим RC, перейдите по ссылке Play2.1RC1 и просмотрите документ ... есть много изменений, таких как Json API fi


Хммм. Не уверен, что гладкость будет работать из коробки с Play так же просто.

Потому что PLay 2.0 на самом деле построен на Scala 2.9.x, где slick требует 2.10 (для макросов).

Итак, сначала существует несоответствие между декларируемыми вами deps (slick_2.10.0-M4 говорит, что я использую Scala 2.10.0-M4) и версией scala, которая будет использоваться.

Кстати, согласно этому сайту-примеру (для Slick) ваши SBT-депы кажутся в порядке. Но проблема может возникнуть из-за того, что драйверу потребуются другие deps (вероятно, AST) и SBT обнаружит правильную версию, используя текущую версию scala, которую вы используете (это делается путем объявления зависимости без версии scala в «имени артефакта») = > В этом случае AST не будет найден, потому что он не существует до версии 2.10.

Что можно попробовать, так это определить другую версию scala для всего проекта...

My 2c

person Andy Petrella    schedule 08.07.2012
comment
по этому примеру сайт какой сайт? - person pedrofurla; 08.07.2012
comment
Круто, не знал, что у Slick есть собственное репо - person pedrofurla; 09.07.2012
comment
play 2.1 RC1 использует scala 2.10 - person Somatik; 25.11.2012

Используя Play 2.1 с последней версией Slick (1.0.1-RC1), вы должны использовать:

val appDependencies = Seq(
  "com.typesafe.slick" %% "slick" % "1.0.1-RC1",
  ...
}
person Brent Faust    schedule 19.05.2013
comment
Да, когда я разместил этот вопрос, было не так много доступной информации. Теперь в репозитории slick на github есть примеры интеграции. - person Salil; 20.05.2013