2017-01-06 3 views
-1

私はスケジューラを作成し、起動時にデータベースにcron式を取得したいと考えています。しかし、私はエラー "java.lang.RuntimeExceptionをコンストラクターを注入中にエラーが発生しました:開始されたアプリケーションがありません"。Play Frameworkでアプリケーションを起動するとデータベースにアクセスするには?

私はこの問題はplay.api.Play.currentを使用していると思うが、私はDB.withConnection {暗黙的な接続=>

のためにそれを必要とする私は、DB接続を注入する必要がありますか?それ、どうやったら出来るの?または私は間違ったアプローチを使用していますか?ご意見をお聞かせください。

これは私がこれまで持っているものです。..

Application.conf

play.modules.enabled += "tasks.MyRecurrentTaskModule" 

MyRecurrentTaskModule.scala

class MyRecurrentTaskModule extends AbstractModule { 
    override def configure() = { 
    bind(classOf[RecurrentTask]).asEagerSingleton() 
    } 
} 

@Singleton 
class RecurrentTask @Inject() (actorSystem: ActorSystem, lifecycle: ApplicationLifecycle) { 

    lifecycle.addStopHook{() => 

     Future.successful(actorSystem.shutdown()) 
    } 
    // Error when I access db 
    val schedule = models.ScheduleTable.getSchedule(1) 
    ... 

} 

ScheduleTable.scala

import play.api.db._ 
import play.api.Play.current 

case class ScheduleTable (
    ... 
) { 
} 

object ScheduleTable { 
val scheduleParser = { 
    ... 
    } 
} 

def getSchedule (ScheduleId: Int): Option[ScheduleTable] = { 
    DB.withConnection { implicit connection => 
     SQL(""" 
      select * from SCHEDULE_TABLE s 
      where s.ScheduleId = {sid} 
      """) 
     .on('sid -> ScheduleId) 
     .as(ScheduleTable.scheduleParser.singleOpt) 
    } 
} 
... 

答えて

-1

私は今すぐにそれを取得しました。まずクラス(Play 2.5)からInject DBApiにオブジェクトを変更する必要があります。ところで私はMyRecurrentTaskModule.scalaはその後MyRecurrentTaskModule.scala

class RecurrentTask @Inject() (actorSystem: ActorSystem, lifecycle: ApplicationLifecycle, scheduleService: TxScheduleSevice) { 
にそれを注入する

@javax.inject.Singleton 
class ScheduleTableSevice @Inject() (dbapi: DBApi) { 

    private val db = dbapi.database("default") 

    val scheduleParser = { 
    ... 
    } 
    } 

    def getSchedule (ScheduleId: Int): Option[ScheduleTable] = { 
    db.withConnection { implicit connection => 
     SQL(""" 
      select * from SCHEDULE_TABLE s 
      where s.ScheduleId = {sid} 
      """) 
     .on('sid -> ScheduleId) 
     .as(scheduleParser.singleOpt) 
    } 
    } 

ScheduleTable.scala

エラーを回避するためにScheduleTableServiceにScheduleTableからそれを名前を変更しました

関連する問題