2013-04-11 5 views
3

У меня есть приложение Play 2.1, которое не запускается, когда у меня неправильный 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 какие-либо крючки для выполнения кода при возникновении исключения во время запуска?

ответ

2

В Play Framework 2 вы можете переопределить некоторые этапы жизненного цикла, расширив GlobalSettings. В частности, onLoadConfig вызывается до того, как конфигурация проанализирована и установлено соединение с БД.

Это (взломанный) пример перехвата ошибок. Вы можете создать поддельный экземпляр 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) 
    } 
} 
+0

С помощью этого подхода вы запускаете «запуск теста» приложения и пул соединений с базой данных перед запуском реального приложения, верно? Как подобрать шины, прежде чем попасть в машину? Кажется, что много дополнительной обработки, но я полагаю, что это только при запуске. –

Смежные вопросы