3

データベース URL が間違っていると Play 2.1 アプリケーションが起動しません。問題は、エラー メッセージがそれほど大きくないことです。

[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構成が解析されて DB 接続が確立される前に呼び出されます。

エラーをインターセプトする (ハックな) 例を次に示します。の偽のインスタンスを作成しApplication、それをConfigurationオブジェクトに渡すことができます。次に、それを使用して のインスタンスをBoneCPPlugin作成し、接続の作成を試みることができます。DB に到達できない場合は、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 に答える