【问题标题】:Play error: Unable to create injector播放错误:无法创建注入器
【发布时间】:2017-01-05 23:30:07
【问题描述】:

我正在尝试使用 play 和 scala 创建一个简单的 restful api。我已经能够创建一些基本路由,让它发回 json 响应,并验证在 POST 中发送的 json。现在我想将持久性添加到 postgres 数据库,这是它开始崩溃的地方。

我首先将 db 信息添加到我的 application.conf 中,创建了一个演变来创建一个表。然后我尝试访问我的 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$1).
  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$1)

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$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:168)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:164)
     play.utils.Threads$.withContextClassLoader(Threads.scala:21)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:164)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131)
     scala.Option.map(Option.scala:146)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129)
     scala.util.Success.flatMap(Try.scala:231)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129)
     play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121)
     scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(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,为简洁起见删除了 cmets:

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
}

我的进化是一个相当简单的创建表语句,它位于 conf/evolutions/default/1.sql 下。

如果能深入了解为什么会发生此错误,以及如何让演进真正运行,我将不胜感激。

【问题讨论】:

  • Play Slick FAQ 中记录了此问题。如果您使用 Slick 访问数据库,请从 libraryDependencies 中删除 jdbc 条目。
  • 无法从您发布的信息中理解问题。如果你还没有解决,如果你想比较,我有一个最小的 Play + Slick 示例:github.com/pedrorijo91/play-slick3-steps
  • Matthias Eckhart - 这解决了问题。谢谢!

标签: postgresql scala playframework-2.0


【解决方案1】:

正如 Matthias Eckhart 在评论中指出的那样:从 build.sbt 中的 libraryDependencies 中删除 jdbc 条目是问题的解决方案。

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 2020-03-11
    • 2013-07-28
    • 2014-07-28
    • 2021-02-24
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多