Play error: Unable to create injector
Play error: Unable to create injector
我正在尝试使用 play 和 scala 创建一个简单的 restful api。我已经能够创建一些基本路由,让它发回 json 响应,并验证在 POST 中发送的 json。现在我想将持久性添加到 postgres 数据库,这是它开始崩溃的地方。
我首先将数据库信息添加到我的 application.conf,创建一个进化以创建一个 table。然后我尝试访问我的 GET 端点以查看它是否 运行 是进化,但我却收到错误消息。这是 html 的错误输出(我使用浏览器访问端点):
CreationException: Unable to create injector, see the following errors:
1) A binding to play.api.db.DBApi was already configured at play.api.db.DBModule.bindings(DBModule.scala:25):
Binding(interface play.api.db.DBApi to ProviderConstructionTarget(class play.api.db.DBApiProvider)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon).
at play.api.db.slick.evolutions.EvolutionsModule.bindings(EvolutionsModule.scala:15):
Binding(interface play.api.db.DBApi to ConstructionTarget(class play.api.db.slick.evolutions.internal.DBApiAdapter) in interface javax.inject.Singleton) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon)
com.google.inject.CreationException: Unable to create injector, see the following errors:
com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
com.google.inject.Guice.createInjector(Guice.java:96)
com.google.inject.Guice.createInjector(Guice.java:84)
play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun$$anonfun.apply(DevServerStart.scala:168)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun$$anonfun.apply(DevServerStart.scala:164)
play.utils.Threads$.withContextClassLoader(Threads.scala:21)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:164)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:131)
scala.Option.map(Option.scala:146)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:131)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:129)
scala.util.Success.flatMap(Try.scala:231)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:129)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:121)
scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24)
scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423)
java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
这是我的路线(请注意,我实际上并没有尝试连接到数据库):
GET /cities controllers.CityController.index
连接到这个控制器的方法:
def index = Action {
Ok(Json.obj("status" ->"OK", "message" -> "You did the thing!"))
}
这是我的 application.conf,为简洁起见删除了评论:
akka {
}
play.crypto.secret = "changeme"
play.modules {
}
play.i18n {
langs = [ "en" ]
}
play.http {
session {
}
flash {
}
}
play.server.netty {
}
play.ws {
ssl {
}
}
play.cache {
}
play.filters {
cors {
}
csrf {
}
headers {
}
hosts {
}
}
play.evolutions {
}
play.db {
prototype {
}
}
db {
db.default.driver=org.postgresql.Driver
db.default.jdbcUrl="jdbc:postgresql://localhost:5432/transit_service"
db.default.username="redacted"
db.default.password="redacted"
db.default.logSql=true
}
我的进化是一个相当简单的 create table 语句,它位于 conf/evolutions/default/1.sql.
下
如果能深入了解为什么会出现此错误,以及我如何才能真正实现 运行。
,我将不胜感激。
正如 Matthias Eckhart 在评论中指出的那样:从 build.sbt 中的 libraryDependencies 中删除 jdbc 条目是问题的解决方案。
我正在尝试使用 play 和 scala 创建一个简单的 restful api。我已经能够创建一些基本路由,让它发回 json 响应,并验证在 POST 中发送的 json。现在我想将持久性添加到 postgres 数据库,这是它开始崩溃的地方。
我首先将数据库信息添加到我的 application.conf,创建一个进化以创建一个 table。然后我尝试访问我的 GET 端点以查看它是否 运行 是进化,但我却收到错误消息。这是 html 的错误输出(我使用浏览器访问端点):
CreationException: Unable to create injector, see the following errors:
1) A binding to play.api.db.DBApi was already configured at play.api.db.DBModule.bindings(DBModule.scala:25):
Binding(interface play.api.db.DBApi to ProviderConstructionTarget(class play.api.db.DBApiProvider)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon).
at play.api.db.slick.evolutions.EvolutionsModule.bindings(EvolutionsModule.scala:15):
Binding(interface play.api.db.DBApi to ConstructionTarget(class play.api.db.slick.evolutions.internal.DBApiAdapter) in interface javax.inject.Singleton) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon)
com.google.inject.CreationException: Unable to create injector, see the following errors:
com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466)
com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
com.google.inject.Guice.createInjector(Guice.java:96)
com.google.inject.Guice.createInjector(Guice.java:84)
play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181)
play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123)
play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun$$anonfun.apply(DevServerStart.scala:168)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun$$anonfun.apply(DevServerStart.scala:164)
play.utils.Threads$.withContextClassLoader(Threads.scala:21)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:164)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply$$anonfun.apply(DevServerStart.scala:131)
scala.Option.map(Option.scala:146)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:131)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get$$anonfun$apply.apply(DevServerStart.scala:129)
scala.util.Success.flatMap(Try.scala:231)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:129)
play.core.server.DevServerStart$$anonfun$mainDev$$anon$$anonfun$get.apply(DevServerStart.scala:121)
scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24)
scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423)
java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
这是我的路线(请注意,我实际上并没有尝试连接到数据库):
GET /cities controllers.CityController.index
连接到这个控制器的方法:
def index = Action {
Ok(Json.obj("status" ->"OK", "message" -> "You did the thing!"))
}
这是我的 application.conf,为简洁起见删除了评论:
akka {
}
play.crypto.secret = "changeme"
play.modules {
}
play.i18n {
langs = [ "en" ]
}
play.http {
session {
}
flash {
}
}
play.server.netty {
}
play.ws {
ssl {
}
}
play.cache {
}
play.filters {
cors {
}
csrf {
}
headers {
}
hosts {
}
}
play.evolutions {
}
play.db {
prototype {
}
}
db {
db.default.driver=org.postgresql.Driver
db.default.jdbcUrl="jdbc:postgresql://localhost:5432/transit_service"
db.default.username="redacted"
db.default.password="redacted"
db.default.logSql=true
}
我的进化是一个相当简单的 create table 语句,它位于 conf/evolutions/default/1.sql.
下如果能深入了解为什么会出现此错误,以及我如何才能真正实现 运行。
,我将不胜感激。正如 Matthias Eckhart 在评论中指出的那样:从 build.sbt 中的 libraryDependencies 中删除 jdbc 条目是问题的解决方案。