如何使用Guice在Scala中进行方法/字段注入?

时间:2019-05-31 22:51:47

标签: scala dependency-injection playframework guice

我正在尝试在Scala中进行方法或字段注入。我正在使用Play框架,该框架使用Guice进行注入。我已经尝试过像

这样的字段注入
@Inject val cache: DefaultSyncCacheApi = null

就像详细的here一样,但是每当我尝试对其进行测试时,我都会得到一个NullPointerException。我也尝试过方法注入,例如:

@Inject
def method(id: String, cache: DefaultSyncCacheApi): Boolean = {
   val cachedItem = cache.get(id)
   cachedItem.isDefined
}

也无济于事。我也必须从另一个地方传递缓存。

我也尝试过使用重载方法并分别注入,例如:

val cache: DefaultSyncCacheApi //this will not work if it is not an abstract class

@Inject //either injecting here
def methodA(id: String): Boolean = {
   methodB(string, cache)
}

@Inject //or injecting here
def methodB(id: String, cache: DefaultSyncCacheApi): Boolean = {
   //same logic as 'method' above
}

无济于事。有没有明确的方法进行方法或现场注入而不会引起NPE?

1 个答案:

答案 0 :(得分:0)

您的问题可能是这些字段的注入时间太早了(在Guice设置应用程序之前)。

因此,您可以尝试将所有val更改为lazy val

我不得不说我只在完美工作的构造函数中使用Injection。您的例子

class HomeController @Inject()(id: String, cache: DefaultSyncCacheApi)

但是对于id,您将需要模块中的提供者。并且因为它是一个字符串,所以应该命名它。这里是一个例子:

Module.scala

  @Provides
  @Named("myIdentitfier")
  def provideId(): String = {
    IdCreator.nextId().
  }

HomeController.scala

class HomeController @Inject()(@Named("myIdentitfier") id: String, cache: DefaultSyncCacheApi)