2012-07-07 30 views
16

Có ai biết về một hướng dẫn hay một dự án mẫu (github) của việc sử dụng khung Play với SLICK (ScalaQuery) không? Tôi đang đấu tranh để làm cho họ làm việc cùng nhau.Play framework + SLICK (Scalaquery) hướng dẫn

Tôi nhận được lỗi này:

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

Đây là mô hình Sách của tôi:

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:
Đây là Build.scala tôi

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

Đầu cơ: đây trông giống như vấn đề về classpath. – pedrofurla

+0

Vui lòng hiển thị tệp Build.scala của bạn. –

+0

@nico_ekito, đã cập nhật câu hỏi của tôi với Build.scala. – Salil

Trả lời

7

Sửa Bây giờ Play2.1 đã bước vào quá trình RC, chúng ta có thể sử dụng Slick. Đó là bởi vì Play2.1 đang sử dụng Scala2.10 (RC) dưới biển và bởi vì Slick sẽ là mặc định truy cập DB lib trong ngăn xếp Typesafe.

Để gọi lại, Slick hiện có thể truy cập RDBMS và cũng sẽ sớm nhắm mục tiêu MongoDB. Nó sử dụng DSL nội bộ (^ ^) để truy vấn các phụ trợ. DSL này được quản lý bởi Macros, đó là lý do tại sao Scala 2.10 là bắt buộc.

Tuy nhiên, lưu ý rằng hệ thống macro ở trạng thái thử nghiệm (ngay cả khi Scala2.10 sẽ được giải phóng). Tôi chưa biết tiềm năng của tình trạng như vậy trên Slick lib trong tương lai gần.

Để tận hưởng RC này, hãy đến đó Play2.1RC1 và duyệt qua tài liệu ... có rất nhiều thay đổi ngoài đó, như API Json f.i.


Hmmmm. Không chắc chắn rằng slick sẽ làm việc ra khỏi hộp với chơi dễ dàng.

Bởi vì PLay 2.0 thực sự được xây dựng dựa trên Scala 2.9.x, trong đó slick yêu cầu 2.10 (đối với Macro).

Vì vậy, ban đầu, có sự không khớp giữa các thông báo bạn đang khai báo (slick_2.10.0-M4 là nói rằng tôi đang sử dụng Scala 2.10.0-M4) và phiên bản scala sẽ được sử dụng.

BTW, theo số this example site (đối với Slick) các khoản thu nhập SBT của bạn có vẻ ổn. Nhưng vấn đề có thể xảy ra là người lái xe sẽ yêu cầu deps khác (AST có thể) và để SBT khám phá phiên bản đúng bằng cách sử dụng phiên bản scala hiện tại bạn đang sử dụng (điều này được thực hiện bằng cách tuyên bố phụ thuộc không có phiên bản scala trong "articfact name") = > Trường hợp này, AST sẽ không được tìm thấy bởi vì nó không tồn tại cho trước 2,10.

Điều gì có thể cố gắng là để xác định một phiên bản khác của scala cho toàn bộ dự án ...

My 2c

+0

"theo trang web ví dụ này" trang web nào? – pedrofurla

+0

oops ... hãy để tôi sửa nó –

+0

Tuyệt, không biết Slick có repo riêng của mình – pedrofurla

1

dùng Chơi 2.1, với bản phát hành Slick mới nhất (1.0.1-RC1), bạn sẽ sử dụng:

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

Yup, khi tôi đăng câu hỏi này, không có nhiều thông tin. Bây giờ, repo github của slick có các ví dụ về sự tích hợp. – Salil

Các vấn đề liên quan