Error with play 2.4.x while trying to inject a database (non deterministic fail)

425 views
Skip to first unread message

Cristian Adamo

unread,
Jul 24, 2015, 3:24:51 PM7/24/15
to scaldi
Hello guys,

I face a issue while trying to get a new instance of a database, but the problem is that sometimes it does inject a database but other when I re compile the project it fails, it really unpredictable fail. i tried that with guice and works it never get a error.
looking a the DBModule.scala on play source code, I see two key object the first one is a DBApi which will be "collecting" the configured databases. So you could inject DBApi and you will always get a Instance of it with or without a database on it.
But if you inspect the content of such object you will see that it do not have any databases.

I want to know if some one face the same problem or have any ideas of what could be happening here.

Thanks in advance for your help!
Regards,
Cristian.


PD: here is the stack trace just in case.

play.api.UnexpectedException: Unexpected exception[IllegalArgumentException: Could not find database for default]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:165) ~[play-server_2.11-2.4.2.jar:2.4.2]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.2.jar:2.4.2]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.2.jar:2.4.2]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.2.jar:2.4.2]
at scala.util.Success.flatMap(Try.scala:230) ~[scala-library-2.11.6.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.2.jar:2.4.2]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:111) ~[play-server_2.11-2.4.2.jar:2.4.2]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.6.jar:na]
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402) ~[na:1.8.0_45]
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[na:1.8.0_45]
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) ~[na:1.8.0_45]
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1689) ~[na:1.8.0_45]
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) ~[na:1.8.0_45]
Caused by: java.lang.IllegalArgumentException: Could not find database for default
at play.api.db.DefaultDBApi$$anonfun$database$1.apply(DefaultDBApi.scala:35) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at play.api.db.DefaultDBApi$$anonfun$database$1.apply(DefaultDBApi.scala:35) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at scala.collection.MapLike$class.getOrElse(MapLike.scala:128) ~[scala-library-2.11.6.jar:na]
at scala.collection.AbstractMap.getOrElse(Map.scala:59) ~[scala-library-2.11.6.jar:na]
at play.api.db.DefaultDBApi.database(DefaultDBApi.scala:35) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at play.api.db.NamedDatabaseProvider.get$lzycompute(DBModule.scala:82) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at play.api.db.NamedDatabaseProvider.get(DBModule.scala:82) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at play.api.db.NamedDatabaseProvider.get(DBModule.scala:80) ~[play-jdbc_2.11-2.4.2.jar:2.4.2]
at scaldi.play.ScaldiBuilder$$anonfun$6$$anonfun$apply$1$$anonfun$10.apply(ScaldiBuilder.scala:206) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.jsr330.AnnotationBinding$$anonfun$getInstance$3.apply(AnnotationBinding.scala:113) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$getInstance$3.apply(AnnotationBinding.scala:113) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at scaldi.jsr330.AnnotationBinding.getInstance(AnnotationBinding.scala:113) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.get(AnnotationBinding.scala:85) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.Binding$$anon$1.get(Binding.scala:23) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.Injectable$$anonfun$injectWithDefault$1.apply(Injectable.scala:43) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.Injectable$$anonfun$injectWithDefault$1.apply(Injectable.scala:43) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scala.Option.flatMap(Option.scala:171) ~[scala-library-2.11.6.jar:na]
at scaldi.Injectable$class.injectWithDefault(Injectable.scala:43) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.play.ScaldiBuilder$.injectWithDefault(ScaldiBuilder.scala:128) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiBuilder$$anonfun$6$$anonfun$apply$1$$anonfun$apply$6.apply(ScaldiBuilder.scala:197) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.ProviderBinding.target(Binding.scala:108) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.ProviderBinding.get(Binding.scala:111) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.ProviderBinding.get(Binding.scala:102) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.Binding$$anon$1.get(Binding.scala:23) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.jsr330.AnnotationBinding$$anonfun$scaldi$jsr330$AnnotationBinding$$injectSymbol$2.apply(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$scaldi$jsr330$AnnotationBinding$$injectSymbol$2.apply(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scala.Option.flatMap(Option.scala:171) ~[scala-library-2.11.6.jar:na]
at scaldi.jsr330.AnnotationBinding.scaldi$jsr330$AnnotationBinding$$injectSymbol(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$22.apply(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$22.apply(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scala.collection.immutable.List.map(List.scala:273) ~[scala-library-2.11.6.jar:na]
at scaldi.jsr330.AnnotationBinding.scaldi$jsr330$AnnotationBinding$$createNewInstance(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$2$$anonfun$apply$2.apply(AnnotationBinding.scala:41) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$2$$anonfun$apply$2.apply(AnnotationBinding.scala:41) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.initNewInstance(AnnotationBinding.scala:119) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.getInstance(AnnotationBinding.scala:111) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.get(AnnotationBinding.scala:85) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.Binding$$anon$1.get(Binding.scala:23) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.jsr330.AnnotationBinding$$anonfun$scaldi$jsr330$AnnotationBinding$$injectSymbol$2.apply(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$scaldi$jsr330$AnnotationBinding$$injectSymbol$2.apply(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scala.Option.flatMap(Option.scala:171) ~[scala-library-2.11.6.jar:na]
at scaldi.jsr330.AnnotationBinding.scaldi$jsr330$AnnotationBinding$$injectSymbol(AnnotationBinding.scala:171) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$22.apply(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$22.apply(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scala.collection.immutable.List.map(List.scala:277) ~[scala-library-2.11.6.jar:na]
at scaldi.jsr330.AnnotationBinding.scaldi$jsr330$AnnotationBinding$$createNewInstance(AnnotationBinding.scala:132) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$2$$anonfun$apply$2.apply(AnnotationBinding.scala:41) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding$$anonfun$2$$anonfun$apply$2.apply(AnnotationBinding.scala:41) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.initNewInstance(AnnotationBinding.scala:119) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.getInstance(AnnotationBinding.scala:111) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.jsr330.AnnotationBinding.get(AnnotationBinding.scala:85) ~[scaldi-jsr330_2.11-0.5.7.jar:0.5.7]
at scaldi.Binding$$anon$1.get(Binding.scala:23) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1$$anonfun$apply$2.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1$$anonfun$apply$2.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1.apply(ScaldiInjector.scala:38) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.2.jar:2.4.2]
at scaldi.play.ScaldiInjector.scaldi$play$ScaldiInjector$$getActualBinding(ScaldiInjector.scala:38) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$instanceOf$1.apply(ScaldiInjector.scala:23) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$instanceOf$1.apply(ScaldiInjector.scala:22) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scala.Option.getOrElse(Option.scala:121) ~[scala-library-2.11.6.jar:na]
at scaldi.play.ScaldiInjector.instanceOf(ScaldiInjector.scala:22) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector.instanceOf(ScaldiInjector.scala:18) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at play.api.inject.RoutesProvider$$anonfun$2.apply(BuiltinModule.scala:67) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.inject.RoutesProvider$$anonfun$2.apply(BuiltinModule.scala:67) ~[play_2.11-2.4.2.jar:2.4.2]
at scala.Option.fold(Option.scala:158) ~[scala-library-2.11.6.jar:na]
at play.api.inject.RoutesProvider.get$lzycompute(BuiltinModule.scala:67) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.inject.RoutesProvider.get(BuiltinModule.scala:63) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.inject.RoutesProvider.get(BuiltinModule.scala:62) ~[play_2.11-2.4.2.jar:2.4.2]
at scaldi.play.ScaldiBuilder$$anonfun$6$$anonfun$apply$1$$anonfun$apply$12.apply(ScaldiBuilder.scala:219) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.ProviderBinding.target(Binding.scala:108) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.ProviderBinding.get(Binding.scala:111) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.ProviderBinding.get(Binding.scala:102) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.Binding$$anon$1.get(Binding.scala:23) ~[scaldi_2.11-0.5.6.jar:0.5.6]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1$$anonfun$apply$2.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1$$anonfun$apply$2.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1.apply(ScaldiInjector.scala:42) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$scaldi$play$ScaldiInjector$$getActualBinding$1.apply(ScaldiInjector.scala:38) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.2.jar:2.4.2]
at scaldi.play.ScaldiInjector.scaldi$play$ScaldiInjector$$getActualBinding(ScaldiInjector.scala:38) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$instanceOf$1.apply(ScaldiInjector.scala:23) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector$$anonfun$instanceOf$1.apply(ScaldiInjector.scala:22) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scala.Option.getOrElse(Option.scala:121) ~[scala-library-2.11.6.jar:na]
at scaldi.play.ScaldiInjector.instanceOf(ScaldiInjector.scala:22) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector.instanceOf(ScaldiInjector.scala:18) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at scaldi.play.ScaldiInjector.instanceOf(ScaldiInjector.scala:15) ~[scaldi-play_2.11-0.5.8.jar:0.5.8]
at play.api.Application$class.routes(Application.scala:111) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.DefaultApplication.routes(Application.scala:240) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:90) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.Play$$anonfun$start$1.apply(Play.scala:87) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.Play$$anonfun$start$1.apply(Play.scala:87) ~[play_2.11-2.4.2.jar:2.4.2]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.2.jar:2.4.2]
at play.api.Play$.start(Play.scala:87) ~[play_2.11-2.4.2.jar:2.4.2]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:156) ~[play-server_2.11-2.4.2.jar:2.4.2]
... 14 common frames omitted

Cristian Adamo

unread,
Jul 24, 2015, 3:30:47 PM7/24/15
to scaldi, cristia...@gmail.com
I forgot is a sqlite DB with JDBC driver

Alexandre Bedrytski

unread,
Jul 25, 2015, 4:52:16 AM7/25/15
to scaldi, cristia...@gmail.com
Hi Cristian,

may I see the corresponding parts from build.sbt, application.conf and the code in the file that needs access to the db?
I'm using Slick and didn't have any non-deterministic problems with finding default database. 
I suppose, when migrating from 2.3 to 2.4, you changed all database config according to the migration guide ?

Regards,
Alexandre

Alexandre Bedrytski

unread,
Jul 26, 2015, 5:37:04 AM7/26/15
to scaldi, cristia...@gmail.com
For reference, Adamo's reply:

Hi Alex,
Actually I started from scratch with play 2.4
From the build.sbt I don't think it should be the problem, I added the jdbc dependency and scaldi-play 0.5.8, and jdbc driver from xerial  org.xerial % sqlite-jdbc % "3.8.7"
from application.conf
db.default.driver=org.sqlite.JDBC
db.default.url="jdbc:sqlite:/home/cristian/main.db"

Source code:

class Application(implicit inj: Injector) extends Controller with Injectable {
    val db
= inject[Database]  
   
def index = Action {
       
var outString = "Number is "
        val conn
= db.getConnection()
       
try {
             val stmt
= conn.createStatement
             val rs
= stmt.executeQuery("SELECT 9 as testkey ")
             
while (rs.next()) {
                  outString
+= rs.getString("testkey")
       
} finally {
             conn
.close()
       
}
       
Ok(outString)
   
}
}


On Friday, July 24, 2015 at 9:24:51 PM UTC+2, Cristian Adamo wrote:

Alexandre Bedrytski

unread,
Jul 26, 2015, 6:35:30 AM7/26/15
to scaldi, cristia...@gmail.com
Here I created an example using play-jdbc with scaldi


It's quite different from your code, so let me explain.
First, in app.modules we create WebModule, a scaldi module for this application.
We abstract DB object into NumberDao and create a binding for it in the module.
Then we inject it into the controller.

Two things are different from your code: I abstracted the DB object into the DAO object and I'm using H2 database instead of SQLlite as it needs installing & configuring.
Please tell me if it solves the problem for you or (in case it doesn't) you need to inject the DB object / it still doesn't work with SQLlite.

Regards,
Alexandre
Reply all
Reply to author
Forward
0 new messages