当Play 2.1在启动时崩溃时如何进行错误记录

时间:2013-04-11 03:14:17

标签: scala playframework-2.1

我有一个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是否提供执行代码的任何钩子?

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)
  }
}