Connect to MSSQL (jtds) with Play and Slick

I have a project that was completed for about a month, which I did using Play 2.1.1, slick and MySQL. Now I need to move this to MSSQL, and I am having some problems.

My application compiles fine and finds drivers, but whenever I try to establish a connection, I get [RuntimeException: java.lang.ExceptionInInitializerError] on the site, and a more detailed error in my console:

 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] 

The most interesting thing I found is this line:

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

He found the driver, because if I entered the wrong name, he gave me an error, with this I entered it is not. I have a jtds driver in my lib directory.

I also connect to db at startup

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

Additional Information:

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 When I refresh the page, although I get another exception with a new set of errors that jtds don't even mention

 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] 
+6
source share
2 answers

play-slick does not know the jTDS driver . Although Slick generally supports a SQL server , play-slick makes a connection to the driver class name for the 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(_) 

As you can see, the Microsoft driver is supported, but jTDS is not. Now you can use the Microsoft JDBC driver or modify play-slick. The change is simple. Just add a line

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

and it should work.

I saw the problem you raised on the GitHub project page. I sent a request that should solve this problem . Perhaps he will be included in the next version of play-slick.

+5
source

I have to add the jtds driver as a dependency in your project:

 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
source

Source: https://habr.com/ru/post/950930/


All Articles