在尝试将服务注入actor时,为什么会出现此IllegalArgumentException异常?

iCo*_*unk 1 scala guice akka playframework

我的代码:

Global.scala - 我只是在启动时设置它,它向actor发送一条快速消息.从这里抛出异常; 我确认注入的服务已加载.

object Global extends GlobalSettings {
  override def onStart(app: Application): Unit = {
    val system = app.actorSystem
    system.actorOf(TempActor.props, TempActor.name) ! "hi hi"
  }
}
Run Code Online (Sandbox Code Playgroud)

TempActor.scala

package actors

class TempActor @Inject() (
    @Named(TestServiceModuleNames.RedisService) redisService: StatusService
  , @Named(TestServiceModuleNames.DynamoDbService) dynamoDbService: StatusService
) extends Actor with ActorLogging {

  override def receive: Receive = {
    case msg: Any =>
      log.info(s"the msg => $msg")
      context.system.shutdown()
  }
}

object TempActor extends NamedActor {
  override def name: String = this.getClass.getSimpleName
  override def props: Props = Props[TempActor]
}
Run Code Online (Sandbox Code Playgroud)

TestServiceModule.scala - 一个guice模块,用于加载actor所需的服务,我确保在application.conf中启用该模块

package modules

class TestServiceModule extends AbstractModule with AkkaGuiceSupport {

  val configs = ConfigFactory.load()

  override def configure(): Unit = {

    bind(classOf[StatusService]).annotatedWith(Names.named(TestServiceModuleNames.RedisService)).toInstance(new RedisStatusServiceImpl(new RedisConfig(configs.getString("redis.host"), configs.getInt("redis.port"))))
    bind(classOf[StatusService]).annotatedWith(Names.named(TestServiceModuleNames.DynamoDbService)).toInstance(new DynamoDBStatusServiceImpl(Region.US_EAST_1, configs.getString("dynamo.db.endpoint"), configs.getString("dynamo.db.table.name.status")))
  }
}

object TestServiceModuleNames {
  final val RedisService = "RedisStatusService"
  final val DynamoDbService = "DynamoDbStatusService"
}
Run Code Online (Sandbox Code Playgroud)

application.conf

redis.host="localhost"
redis.port=4242

dynamo.db.endpoint="http://localhost:8000"
dynamo.db.table.name.status="status"

play.modules {
  enabled += "modules.TestServiceModule"
}

play.akka.actor-system="warden"

akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  loglevel = "DEBUG"
}
Run Code Online (Sandbox Code Playgroud)

我的目标是有一个播放应用程序,后端处理由演员处理.每个actor都会对不同的服务有某些依赖关系,我试图使用google Guice注入这些服务.

我启动应用程序时得到的只是异常跟踪:

java.lang.IllegalArgumentException: no matching constructor found on class actors.TempActor for arguments []
Run Code Online (Sandbox Code Playgroud)

我不确定如何解决这个问题......

我正在使用Play 2.4.

mat*_*its 5

该行override def props: Props = Props[TempActor]试图调用TempActor的零参数构造函数版本,其中不存在任何版本.Props背后的Akka代码中没有任何内容可以让它理解您正在使用Google Guice并相应地创建TempActor.

你可以这样做:

override def props: Props = Props[TempActor] = {
  Injector injector = Guice.createInjector(new TestServiceModule());
  Props(injector.getInstance(TempActor.class))
}
Run Code Online (Sandbox Code Playgroud)