2013-08-02 44 views
6

Tôi có một dự án đã hoàn thành trong khoảng một tháng mà tôi đã thực hiện bằng cách sử dụng Play 2.1.1, slick và MySQL. Bây giờ tôi cần phải chuyển nó sang MSSQL và tôi đang gặp một số vấn đề.Kết nối với MSSQL (jtds) với Play và Slick

Ứng dụng của tôi biên dịch tốt, và tìm thấy các trình điều khiển, nhưng bất cứ khi nào tôi cố gắng để tạo kết nối tôi nhận được một [RuntimeException: java.lang.ExceptionInInitializerError] trên trang web, và một lỗi chi tiết hơn trong giao diện điều khiển của tôi là:

play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.ExceptionInInitializerError]] 
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1] 
    at play.api.DefaultApplication.handleError(Application.scala:383) ~[play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) ~[play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) ~[play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.1]java.lang.RuntimeException: java.lang.ExceptionInInitializerError 
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:222) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:18) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:108) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:106) ~[play_2.10.jar:2.1.1]Caused by: java.lang.ExceptionInInitializerError: null 
    at controllers.Application$$anonfun$addLicense$1.apply(Application.scala:18) ~[na:na] 
    at controllers.Application$$anonfun$addLicense$1.apply(Application.scala:17) ~[na:na] 
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:217) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:18) ~[play_2.10.jar:2.1.1] 
Caused by: play.api.Configuration$$anon$1: Configuration error[Slick error : Unknown jdbc driver found in application.conf: [net.sourceforge.jtds.jdbc.Driver]] 
    at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:80) ~[play_2.10.jar:2.1.1] 
    at play.api.Configuration.reportError(Configuration.scala:558) ~[play_2.10.jar:2.1.1] 
    at play.api.db.slick.Config$.driver(Config.scala:21) ~[play-slick_2.10-0.3.3.jar:0.3.3] 
    at play.api.db.slick.Config$.driver$lzycompute(Config.scala:7) ~[play-slick_2.10-0.3.3.jar:0.3.3] 
    at play.api.db.slick.Config$.driver(Config.scala:7) ~[play-slick_2.10-0.3.3.jar:0.3.3] 
    at models.License$.<init>(License.scala:38) ~[na:na] 

Thú vị nhất điều mà tôi đã tìm thấy là dòng này mặc dù:

Caused by: play.api.Configuration$$anon$1: Configuration error[Slick error : Unknown jdbc driver found in application.conf: [net.sourceforge.jtds.jdbc.Driver]] 

Nó tìm thấy trình điều khiển vì nếu tôi đặt sai tên, nó sẽ cho tôi lỗi; Tôi có trình điều khiển jtds trong thư mục lib của mình.

tôi cũng kết nối với db khi khởi động

[info] play - database [default] connected at jdbc:jtds:sqlserver://ServerAddress/EGLC 

Một số thông tin bổ sung:

application.conf:

db.default.url="jdbc:jtds:sqlserver://ServerAddress/EGLC" 
db.default.driver=net.sourceforge.jtds.jdbc.Driver 
db.default.user="sa" 
db.default.password="pass" 
slick.default="models.*" 

Build.scala:

val appDependencies = Seq(
// Add your project dependencies here, 
jdbc, 
"mysql" % "mysql-connector-java" % "5.1.25", 
"net.sourceforge.jtds" % "jtds" % "1.3.1", 
"com.typesafe.play" %% "play-slick" % "0.3.3" 
) 

EDIT Khi tôi làm mới một trang mặc dù tôi nhận được một ngoại lệ khác nhau với một bộ mới của lỗi mà thậm chí không đề cập đến jtds

play.api.Application$$anon$1: Execution exception[[RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class models.Location$]] 
    at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1] 
    at play.api.DefaultApplication.handleError(Application.scala:383) ~[play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) ~[play_2.10.jar:2.1.1] 
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) ~[play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.1] 
    at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) ~[play_2.10.jar:2.1.1]java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class models.Location$ 
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:222) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 
    at play.utils.Threads$.withContextClassLoader(Threads.scala:18) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:108) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:106) ~[play_2.10.jar:2.1.1] 
Caused by: java.lang.NoClassDefFoundError: Could not initialize class models.Location$ 
    at controllers.Application$$anonfun$locations$1$$anonfun$apply$12$$anonfun$apply$13.apply(Application.scala:47) ~[na:na] 
    at controllers.Application$$anonfun$locations$1$$anonfun$apply$12$$anonfun$apply$13.apply(Application.scala:46) ~[na:na] 
    at controllers.Secured$$anonfun$IsAuthenticated$3$$anonfun$apply$3.apply(Auth.scala:38) ~[na:na] 
    at controllers.Secured$$anonfun$IsAuthenticated$3$$anonfun$apply$3.apply(Auth.scala:38) ~[na:na] 
    at play.api.mvc.ActionBuilder$$anon$1.apply(Action.scala:217) ~[play_2.10.jar:2.1.1] 
    at play.api.mvc.Action$$anonfun$apply$1$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:109) ~[play_2.10.jar:2.1.1] 

Trả lời

5

play-slick không biết jTDS driver. Trong khi Slick nói chung supports SQL server, play-trơn makes a connection from driver class name to Slick driver:

private def driverByName : String => Option[ExtendedDriver] = Map(
    "org.apache.derby.jdbc.EmbeddedDriver" -> DerbyDriver 
    ,"org.h2.Driver" -> H2Driver 
    ,"org.hsqldb.jdbcDriver" -> HsqldbDriver 
    ,"com.mysql.jdbc.Driver" -> MySQLDriver 
    ,"org.postgresql.Driver" -> PostgresDriver 
    ,"org.sqlite.JDBC" -> SQLiteDriver 
    ,"com.microsoft.sqlserver.jdbc.SQLServerDriver" -> SQLServerDriver 
).get(_) 

Như bạn có thể thấy, tài xế của Microsoft được hỗ trợ trong khi jTDS thì không. Bây giờ bạn có thể sử dụng trình điều khiển JDBC của Microsoft hoặc sửa đổi chơi-slick. Sự thay đổi rất đơn giản. Chỉ cần thêm dòng

,"net.sourceforge.jtds.jdbc.Driver" -> SQLServerDriver 

và nó sẽ hoạt động.

Tôi đã xem số issue that you have raised trên trang GitHub của dự án. Tôi đã gửi pull request that should resolve this issue. Có thể nó được đưa vào phiên bản tiếp theo của trò chơi.

+0

Cảm ơn ít nhất bây giờ tôi biết những gì đang xảy ra. Vấn đề duy nhất là phiên bản hiện tại của plugin có một cú pháp khác và tôi thực sự không muốn đi và thay đổi tất cả các mã cũ của tôi. Tôi đã thử bằng cách sử dụng trình điều khiển MS jdbc nhưng nó không tìm thấy nó khi tôi đặt nó trong lib. Bất kỳ ý tưởng tại sao nó có thể không tìm thấy người lái xe? – kingdamian42

+0

Cú pháp khác nhau? Hãy để tôi đoán: bạn nhận được lỗi trình biên dịch ở đầu của phương pháp cơ sở dữ liệu của bạn, tại hoặc xung quanh 'ngầm ẩn phiên =>'? Chỉ cần định nghĩa kiểu của nó và phần còn lại có thể giữ nguyên: 'phiên ngầm định: Phiên =>'. Tuy nhiên, không biết về trình điều khiển của Microsoft. Có thể một người khác làm. – Carsten

+0

Ah có lẽ là như vậy.Và vấn đề trình điều khiển máy chủ SQL là một thứ tự sai lầm nghiêm trọng của các gói. Tuy nhiên bây giờ nó nói rằng nó không thể kết nối với db bằng cách sử dụng 'db.default.url =" jdbc: microsoft: sqlserver: // ServerAddress/EGLC "' hoặc 'db.default.url =" jdbc: sqlserver: // ServerAddress/EGLC " Vì vậy, tôi không chắc chắn những gì đang xảy ra ... Cảm ơn bạn đã giúp đỡ, tôi chỉ có thể xác định loại và nâng cấp nếu/khi yêu cầu kéo được chấp nhận. – kingdamian42

0

tôi nên thêm tài xế jtds như một sự phụ thuộc vào dự án của bạn:

val appDependencies = Seq(
// Add your project dependencies here, 
jdbc, 
"com.typesafe.play" %% "play-slick" % "0.3.3", 
"net.sourceforge.jtds" % "jtds" % "1.3.0" 
) 
+0

Tôi có bình trong thư mục lib của mình. – kingdamian42