Play Framework 2.5.x(Scala)にて、Akkaを利用して、定期的に、ジョブを実行しようとしてます。
定期的に実行されるプログラムに、DIを利用して、Databaseを処理するクラスの設定を行っているのですが、
DIの設定方法が悪いせいか、下記のエラーが発生します。
[info] Compiling 1 Scala source to /Users/you/Documents/Aiko/Source/aiko-batch-play/target/scala-2.11/classes... [error] application - ! @74efp4d43 - Internal server error, for (GET) [/] -> play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors: 1) Error injecting constructor, java.lang.IllegalArgumentException: no matching constructor found on class models.ClearDBActor for arguments [] at services.CronJob.<init>(CronJob.scala:22) at services.CronJob.class(CronJob.scala:22) while locating services.CronJob at Module.configure(Module.scala:11) (via modules: com.google.inject.util.Modules$OverrideModule -> Module) while locating services.Cron 1 error] at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131) at scala.Option.map(Option.scala:146) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129) at scala.util.Success.flatMap(Try.scala:231) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:129) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:121) at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors: 1) Error injecting constructor, java.lang.IllegalArgumentException: no matching constructor found on class models.ClearDBActor for arguments [] at services.CronJob.<init>(CronJob.scala:22) at services.CronJob.class(CronJob.scala:22) while locating services.CronJob at Module.configure(Module.scala:11) (via modules: com.google.inject.util.Modules$OverrideModule -> Module) while locating services.Cron 1 error at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466) at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:184) at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:110) at com.google.inject.Guice.createInjector(Guice.java:96) at com.google.inject.Guice.createInjector(Guice.java:84) at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:181) at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:123) at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:168) at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:164) Caused by: java.lang.IllegalArgumentException: no matching constructor found on class models.ClearDBActor for arguments [] at akka.util.Reflect$.error$1(Reflect.scala:81) at akka.util.Reflect$.findConstructor(Reflect.scala:105) at akka.actor.NoArgsReflectConstructor.<init>(IndirectActorProducer.scala:103) at akka.actor.IndirectActorProducer$.apply(IndirectActorProducer.scala:60) at akka.actor.Props.producer(Props.scala:131) at akka.actor.Props.<init>(Props.scala:144) at akka.actor.Props$.apply(Props.scala:86) at services.CronJob.<init>(CronJob.scala:26) at services.CronJob$$FastClassByGuice$$50d5309f.newInstance(<generated>) at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40)
Injectionに登録する際に、指定のクラスのコンストラクタがみつからないですよということですが、どのように登録してあげればよいか方法がわからずにおります。
▼Module.scala
scala
1import com.google.inject._ 2import models.ClearDBActor 3import play.api.libs.concurrent.AkkaGuiceSupport 4import services._ 5 6class Module extends AbstractModule with AkkaGuiceSupport { 7 8 override def configure() = { 9 10 bind(classOf[Cron]).to(classOf[CronJob]).asEagerSingleton() 11 12 } 13 14} 15
▼CronJob.scala
package services import com.google.inject._ import play.api.libs.concurrent.Akka import akka.actor.{Actor, ActorRef, ActorSystem, Props} import com.google.inject.ImplementedBy import scala.concurrent.ExecutionContext.Implicits.global import play.api.inject.ApplicationLifecycle import scala.concurrent.{ExecutionContext, Future} import com.typesafe.akka.extension.quartz.QuartzSchedulerExtension import models.ClearDBActor import models.dao.RustPrevDao import play.api.db.slick.DatabaseConfigProvider import play.api.i18n.MessagesApi @ImplementedBy(classOf[CronJob]) trait Cron @Singleton class CronJob @Inject()(protected val dbConfigProvider: DatabaseConfigProvider, val messagesApi: MessagesApi, rustPrevDao: RustPrevDao, system: ActorSystem, lifeCycle: ApplicationLifecycle)(implicit executionContext: ExecutionContext) extends Cron { import scala.concurrent.duration._ val ClearDBActor = system.actorOf(Props(classOf[ClearDBActor])) QuartzSchedulerExtension(system).schedule("ClearDB", ClearDBActor, "") }
こちらのサイトを参考にさせて頂きました。
http://zuqqhi2.com/scala-play-request-driven
大変、お手数をおかけしますが、ご教授宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。