16

SLICK (ScalaQuery) で Play フレームワークを使用するための優れたチュートリアルまたはサンプル プロジェクト (github) を知っている人はいますか? 私はそれらを連携させるのに苦労しています。

このエラーが発生しています:

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

}
4

2 に答える 2

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 fi のように、そこには多くの変更があります。


うーん。Play as easy ですぐに使えるかどうかはわかりません。

PLay 2.0 は実際には Scala 2.9.x に基づいて構築されているため、slick では (マクロ用に) 2.10 が必要です。

slick_2.10.0-M4したがって、最初は、宣言している dep (私は Scala 2.10.0-M4 を使用していると言っています) と使用される scala バージョンの間に不一致があります。

ところで、このサンプル サイト(Slick 用) によると、SBT deps は問題ないようです。しかし、ドライバーが他の deps (おそらく AST) を必要とし、現在使用している scala バージョンを使用して SBT が適切なバージョンを検出するという問題が発生する可能性があります (これは、「アーティファクト名」で scala バージョンなしで依存関係を宣言することによって行われます) = > この場合、2.10 より前の AST は存在しないため、AST は見つかりません。

試行できることは、プロジェクト全体に対して別のバージョンの scala を定義することです...

私の2c

于 2012-07-08T16:10:15.930 に答える