在Scala中,@Inject是如何工作的?

12

我想知道在Play-Scala中,@Inject注释是如何工作的。它显然是用来注入依赖的,但我很好奇它是如何工作的。 当我在扩展控制器类并将路由生成器设置为injectroutesgenerator时使用它,它似乎可以自动从这些类创建对象,但是我该如何在其他上下文中使用它呢?

我尝试过:

@Inject val mailer: MailerClient = null

但那似乎行不通。是否有可能直接将@Inject的内容(如mailerClient、WS等)注入到值中,而不是控制器类中?

1个回答

8

看起来很接近。将val更改为var,因为它不是最终值,并且需要在稍后的阶段注入。

@Inject var mailer: MailerClient = null

我还建议检查项目配置中是否将MailerClient库作为依赖项列出。您可以尝试使用WSClient,因为它已经包含在模板中:

@Inject var ws: WSClient = null

特别是我知道这个特定的内容是有效的。

更新

在GitHub上创建了一个演示,其中包含Play-Scala模板,并将index方法更改如下:

此外,还请参考以下链接:https://github.com/bjfletcher/play-inject-field-example

import play.api._
import play.api.libs.ws.WSClient
import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits.defaultContext

class Application extends Controller {

  @Inject var ws: WSClient = null

  def index = Action.async {
    ws.url("http://google.com").get.map(r => Ok(r.body))
  }

}

看起来很正常,但仍然出现了NullPointerException。 - Haito
当将MailerClient注入类中时,它的工作效果非常好,但是当我这样做时:“@Inject var mailer: MailerClient = null”,请参考https://github.com/Hajtosek/mailTest/blob/master/app/service/Mail.scala。 - Haito
那么你是在告诉我,我只能在控制器上使用 @Inject 吗? - Haito
1
非常感谢!你帮了我很多忙。 - Haito
2
没问题,你需要告诉系统关于可注入模块的信息(@Singleton本身是不够的)。这里有一个Play 2.4特定示例:http://stackoverflow.com/a/30959808/722180。同时,这里还有更多Scala实现方式的参考:http://stackoverflow.com/a/24823300/722180。 - bjfletcher
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接