2016-04-02 8 views
0

In unserem Projekt injiziert wir immer dbConfigProvider: DatabaseConfigProvider in unsere Bean-Objekte und dann Datenbankoperationen mit db.run(some query), gibt Future zurück. Wie kann ich einen Protokollwrapper für db.run schreiben, der alle sql Ausnahmen druckt.Wrapper abfangen Ausnahmen auf db.run Anruf

Beispiel:

class SomeBeanImpl @Inject()(dbConfigProvider: DatabaseConfigProvider) { 
    private val logger = Logger(getClass) 

    def someDBQuery() = { 
    db.run(some wrong sql query) // exception raised in future, I need to print it with logger 
    } 
} 

Hinweis: Wenn ich .onFailuredb.run auf jeder addieren nennen es wird mein Code vermasseln sehr schlecht. Deshalb muss ich diesen Wrapper für alle db.run Aufrufe schreiben.

Wenn ich db.run in einer Funktion mit unterschiedlicher Signatur wickel, muss ich es an vielen Stellen ändern, was nicht die beste Option ist. Wie kann ich das implizit tun?

+0

Was ist das Problem, das Sie diesen Wrapper schreiben? – Dima

+0

@Dima Ich habe keine Ahnung, wie es überhaupt geht. –

+0

'def Wrapper (Abfrage: String) = db.run (Abfrage) .onFailure {Fall ex => logger.error (ex)}' – Dima

Antwort

1

Sie brauchen nicht explizit eine neue Wrapper-Klasse zu erstellen, können Sie das Pimp My Library Muster verwenden, um eine implizite Methode zu schaffen, die den Aufruf von db.run wickelt und fügt einen onFailure zu den Future:

object MyExtensions { 
    class DbExtensions(db: Db) { 
    def runAndLog(query: String): Future[String] = { 
     val result = db.run(query) 
     result.onFailure { 
     case e => Logger.getLogger("x").error(s"Exception: $e") 
     } 
     result 
    } 
    } 
    implicit def dbExtention(db: Db): DbExtensions = new DbExtensions(db) 
} 

class Db { 
    def run(query: String): Future[String] = Future.successful("Hello") 
} 

object App extends Application { 
    import MyExtensions._ 
    val db = new Db 
    db.runAndLog("hello") 
} 

Für 2.10 Scala und höher, kann dies deutlich mit Implicit Classes verkürzt werden:

implicit class DbExtensions(val db: Db) { 
    def runAndLog(query: String): Future[String] = { 
    val result = db.run(query) 
    result.onFailure { 
     case e => Logger.getLogger("x").error(s"Exception: $e") 
    } 
    result 
    } 
} 

class Db { 
    def run(query: String): Future[String] = Future.successful("Hello") 
} 

object App extends Application { 
    val db = new Db 
    db.runAndLog("hello") 
} 

Sie können weitere DbExtensions erweiternmachenfür eine Leistungsoptimierung:

implicit class DbExtensions(val db: Db) extends AnyVal 
-1

eine neue Klasse bilden:

case class DBWrapper(db: DatabaseComponent) { 
    def run(query: String) = db.run(query).onFailure { case e => logger.error(e) } 
    } 

und ersetzen Sie Ihren db wo immer Sie es mit DBWrapper(db) initialisieren. Sie können die Konvertierungen auch implizit ausführen, obwohl ich dies in diesem Fall nicht empfehlen würde.

Verwandte Themen