在启动时向 Play 2.4 中的演员注入服务

Posted

技术标签:

【中文标题】在启动时向 Play 2.4 中的演员注入服务【英文标题】:Injecting service to an actor in Play 2.4 on startup 【发布时间】:2015-12-09 15:01:07 【问题描述】:

我目前正在迁移到 Play 2.4,但在向演员注入服务时遇到了问题。

我已将演员创建从 GlobalSettings.onStart 移至模块。

模块:

class MailerModule extends AbstractModule with AkkaGuiceSupport 
  override def configure() = 
    bindActor[Mailer]("mailer")
  

演员:

class Mailer @Inject() (service: MailService) extends Actor 
...

现在当我启动应用程序时出现错误:Error injecting constructor, java.lang.RuntimeException: There is no started application at services.MailService.<init>(MailService.scala:14)

但是,如果我将 Logger 添加到演员类

class Mailer @Inject() (service: MailService) extends Actor 
  Logger.info("Starting Mailer...")
  ...

没有错误。我不知道它为什么会这样。这看起来不是一个好的解决方案。还有其他吗?

编辑:它不起作用。看起来它是不确定的。我应该如何初始化它?

【问题讨论】:

【参考方案1】:

邮件程序本身可能存在问题。它是引发异常的那个。它对应用程序本身有某种依赖,有时应用程序在服务的初始化逻辑启动之前就已经启动,有时则不然。也许你对服务有更多的重构,并且也向它注入了一些东西,或者以任何方式延迟它的执行。也许您可以从邮件服务中添加代码。

【讨论】:

MailService 扩展了具有val wsClient = Play.current.injector.instanceOf[WSClient] 的特征。我只需要做到lazy val 就可以了。谢谢!

以上是关于在启动时向 Play 2.4 中的演员注入服务的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.4 - 在 Eager 单例模块中使用 Ebean

Scala Play Framework,在哪里创建演员?

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

Play Framework 2.4 在 Scala 模板中使用注入变量

插件如何在 play 2.4 中使用注入和对象而不是类

在 Akka actor 中玩 2.4 依赖注入