質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

Q&A

解決済

1回答

3215閲覧

Play Scala Akka内で、DIをしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Play Framework 2

Play Framework 2はPlayのメジャーバージョンです。現代の web アプリケーション開発に必要なコンポーネント及び API を統合した生産性の高い Java と Scala の web アプリケーションフレームワークです。

0グッド

1クリップ

投稿2017/06/25 23:14

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

大変、お手数をおかけしますが、ご教授宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自己解決しました。

下記のURLに書いてあったのですが、コンストラクタ付きのものを呼び出す方法が記載してありました。

リンク内容

▼CronJob

scala

1@Singleton 2class CronJob @Inject()(protected val dbConfigProvider: DatabaseConfigProvider, val messagesApi: MessagesApi, rustPrevDao: RustPrevDao, system: ActorSystem, lifeCycle: ApplicationLifecycle)(implicit executionContext: ExecutionContext) extends Cron { 3 4 import scala.concurrent.duration._ 5 6 val actor = system.actorOf(ClearDBActor.props(rustPrevDao)) 7 QuartzSchedulerExtension(system).schedule("ClearDB", actor, "") 8}

▼ClearDBActor

scala

1object ClearDBActor { 2 def props(rustPrevDao: RustPrevDao) = Props(new ClearDBActor(rustPrevDao)) 3} 4 5//class ConfiguredActor @Inject() (configuration: Configuration) extends Actor { 6// import ConfiguredActor._ 7// 8// val config = configuration.getString("my.config").getOrElse("none") 9 10 11class ClearDBActor @Inject()(rustPrevDao: RustPrevDao) extends Actor { 12 13 def receive = { 14 case msg: String => { 15 16 val shots = rustPrevDao.limitSearch() 17 Logger.info("Old DB records were cleared.") 18 } 19 } 20}

投稿2017/06/27 04:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問