3

我有一个 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 是否提供任何挂钩来在启动期间出现异常时执行代码?

4

1 回答 1

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)
  }
}
于 2013-04-11T06:48:11.183 回答