使用 Slick、PlayFramework 和 PostgreSQL 启动应用程序时出现异常
Exception when starting app with Slick, PlayFramework and PostgreSQL
我正在尝试将一些数据存储在 PostgreSQL 数据库中。这可以通过 PlayFramework 呈现的一个小表单来完成。我想测试 Slick 插件以获得一些使用经验,但我陷入了这个异常:
ProvisionException: Unable to provision, see the following errors:
1) Could not find a suitable constructor in services.Consumptions.
Classes must have either one (and only one) constructor annotated with
@Inject or a zero-argument constructor that is not private.
at services.Consumptions.class(Tables.scala:17)
while locating services.Consumptions
for parameter 0 at controllers.HouseSummary.<init>
(HouseSummary.scala:18)
while locating controllers.HouseSummary
for parameter 3 at router.Routes.<init>(Routes.scala:39)
while locating router.Routes
while locating play.api.inject.RoutesProvider
while locating play.api.routing.Router
for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.
<init>(HttpRequestHandler.scala:200)
while locating play.api.http.JavaCompatibleHttpRequestHandler
while locating play.api.http.HttpRequestHandler
for parameter 4 at play.api.DefaultApplication.<init>
(Application.scala:221)
at play.api.DefaultApplication.class(Application.scala:221)
while locating play.api.DefaultApplication
while locating play.api.Application
我做错了什么?我的 project/plugins.sbt
是:
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10")
// web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6")
主要问题是这工作正常并将所有内容保存在 PostgreSQL 数据库中:
object MyApp extends App {
val query = TableQuery[Consumptions]
val db = Database.forConfig("pg-postgres")
try {
Await.result(
db.run(DBIO.seq(query += consumption(0, DateTime.now(), 50.5,50.5,50.5,50.5))),
Duration.Inf
)
} finally {
db.close
}
}
这是控制器:
@Singleton
class HouseSummary @Inject()(consumptions: Consumptions) extends Controller {
val query = TableQuery[Consumptions]
val db = Database.forConfig("pg-postgres")
def add = Action { implicit request =>
summaryForm.bindFromRequest.fold(
formWithErrors => {
// binding failure, you retrieve the form containing errors:
BadRequest(formWithErrors.toString)
},
summaryData => {
/* binding success, you get the actual value. */
val newEntry = AddSummaryRequest(
summaryData.date,
summaryData.waterconsumption,
summaryData.electricityheater_1,
summaryData.electricityheater_2,
summaryData.electricitymain
)
Consumptions.add(newEntry)
try {
Await.result(db.run(DBIO.seq(
query += consumption(
0,
new DateTime(newEntry.date),
summaryData.waterconsumption,
summaryData.electricityheater_1, summaryData.electricitymain,
summaryData.electricityheater_2
)
)), Duration.Inf)
} finally db.close
Ok(s"Erfolgreich gespeichert für das Datum: ${summaryData.date}")
}
)
}
def summaryForm = Form(
mapping(
"date" -> date,
"waterconsumption" -> of[Double],
"electricityheater_1" -> of[Double],
"electricityheater_2" -> of[Double],
"electricitymain" -> of[Double]
)(AddSummaryRequest.apply)(AddSummaryRequest.unapply))
}
我发现了错误。我已经尝试注入 Consumption class,如果你想注入的 class 没有构造函数或类似的东西,那是行不通的,因为 guice 不知道如何注入这个 class.
改变这个:
class HouseSummary @Inject()(consumptions: Consumptions) extends Controller
对此:
class HouseSummary @Inject()() extends Controller
解决了问题
我正在尝试将一些数据存储在 PostgreSQL 数据库中。这可以通过 PlayFramework 呈现的一个小表单来完成。我想测试 Slick 插件以获得一些使用经验,但我陷入了这个异常:
ProvisionException: Unable to provision, see the following errors:
1) Could not find a suitable constructor in services.Consumptions.
Classes must have either one (and only one) constructor annotated with
@Inject or a zero-argument constructor that is not private.
at services.Consumptions.class(Tables.scala:17)
while locating services.Consumptions
for parameter 0 at controllers.HouseSummary.<init>
(HouseSummary.scala:18)
while locating controllers.HouseSummary
for parameter 3 at router.Routes.<init>(Routes.scala:39)
while locating router.Routes
while locating play.api.inject.RoutesProvider
while locating play.api.routing.Router
for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.
<init>(HttpRequestHandler.scala:200)
while locating play.api.http.JavaCompatibleHttpRequestHandler
while locating play.api.http.HttpRequestHandler
for parameter 4 at play.api.DefaultApplication.<init>
(Application.scala:221)
at play.api.DefaultApplication.class(Application.scala:221)
while locating play.api.DefaultApplication
while locating play.api.Application
我做错了什么?我的 project/plugins.sbt
是:
// The Play plugin
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.10")
// web plugins
addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1")
addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0")
addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6")
主要问题是这工作正常并将所有内容保存在 PostgreSQL 数据库中:
object MyApp extends App {
val query = TableQuery[Consumptions]
val db = Database.forConfig("pg-postgres")
try {
Await.result(
db.run(DBIO.seq(query += consumption(0, DateTime.now(), 50.5,50.5,50.5,50.5))),
Duration.Inf
)
} finally {
db.close
}
}
这是控制器:
@Singleton
class HouseSummary @Inject()(consumptions: Consumptions) extends Controller {
val query = TableQuery[Consumptions]
val db = Database.forConfig("pg-postgres")
def add = Action { implicit request =>
summaryForm.bindFromRequest.fold(
formWithErrors => {
// binding failure, you retrieve the form containing errors:
BadRequest(formWithErrors.toString)
},
summaryData => {
/* binding success, you get the actual value. */
val newEntry = AddSummaryRequest(
summaryData.date,
summaryData.waterconsumption,
summaryData.electricityheater_1,
summaryData.electricityheater_2,
summaryData.electricitymain
)
Consumptions.add(newEntry)
try {
Await.result(db.run(DBIO.seq(
query += consumption(
0,
new DateTime(newEntry.date),
summaryData.waterconsumption,
summaryData.electricityheater_1, summaryData.electricitymain,
summaryData.electricityheater_2
)
)), Duration.Inf)
} finally db.close
Ok(s"Erfolgreich gespeichert für das Datum: ${summaryData.date}")
}
)
}
def summaryForm = Form(
mapping(
"date" -> date,
"waterconsumption" -> of[Double],
"electricityheater_1" -> of[Double],
"electricityheater_2" -> of[Double],
"electricitymain" -> of[Double]
)(AddSummaryRequest.apply)(AddSummaryRequest.unapply))
}
我发现了错误。我已经尝试注入 Consumption class,如果你想注入的 class 没有构造函数或类似的东西,那是行不通的,因为 guice 不知道如何注入这个 class.
改变这个:
class HouseSummary @Inject()(consumptions: Consumptions) extends Controller
对此:
class HouseSummary @Inject()() extends Controller
解决了问题