我有一个Play 2.1应用程序,当我有错误的数据库URL时它无法启动。问题是,错误信息不是很好。
[error] c.j.b.h.AbstractConnectionHook - Failed to obtain initial connection Sleeping for 0ms and trying again. A ttempts left: 0. Exception: null
Oops, cannot start the server.
Configuration error: Configuration error[Cannot connect to database [default]]
at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:74)
at play.api.Configuration.reportError(Configuration.scala:552)
at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:248)
at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:239)
....
我希望服务器转储它在这种情况下尝试使用的数据库URL。当启动期间出现异常时,Play 2.1是否提供执行代码的任何钩子?
答案 0 :(得分:2)
在Play Framework 2中,您可以通过扩展GlobalSettings
来覆盖生命周期的某些阶段。具体来说,在解析配置并建立数据库连接之前调用onLoadConfig
。
这是拦截错误的(hacky)示例。您可以创建Application
的虚假实例,然后将Configuration
对象传递给它。然后,您可以使用它来创建BoneCPPlugin
的实例并尝试创建连接。如果无法访问数据库,您将能够在catch块中拦截它。
import java.io.File
import play.api._
import play.api.db.BoneCPPlugin
import scala.util.control.NonFatal
object Global extends GlobalSettings {
override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode) = {
val app = new DefaultApplication(path, classloader, None, mode){
override lazy val configuration = config
}
try {
new BoneCPPlugin(app).onStart()
} catch {
case e: PlayException =>
// handle
case _ => // other types of errors that we don't care about here
}
super.onLoadConfig(config, path, classloader, mode)
}
}