Tyler
Tyler

Reputation: 18177

Can't inject actorSystem in service

I am trying to create a service that runs in the background of my app (reads and writes to a queue) that I want to build with the actor system. However I am getting an error when I try to inject an ActorSystem into my class:

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 services.Indexer$IndexActor for arguments []
  at services.Indexer.<init>(Indexer.scala:21)
  at Module.configure(Module.scala:6) (via modules: com.google.inject.util.Modules$OverrideModule -> Module)
  while locating services.Indexer

Here is my setup:

// Module.scala
class Module extends AbstractModule {
    override def configure() = {
        bind(classOf[Indexer]).asEagerSingleton()   // I suspect this needs to change
    }
}

// Indexer.scala
@Singleton
class Indexer @Inject() (appLifecycle: ApplicationLifecycle, system: ActorSystem) (implicit ec: ExecutionContext) { ... } 

In the play documentation there is an example of injecting an actor system, but that only seems to work when you inject into a class which extends Controller:

@Singleton
class MyController @Inject()(system: ActorSystem)(implicit exec: ExecutionContext) extends Controller {

    // This works

}

Upvotes: 1

Views: 362

Answers (1)

Tyler
Tyler

Reputation: 18177

Found the problem:

In Module.scala I am using the com.google.inject package

import com.google.inject.AbstractModule  // <-------
import services.Indexer

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

But in my Indexer.scala service I was using the javax.inject package.

I have switched all of my files to now:

import com.google.inject._

Upvotes: 1

Related Questions