我正在尝试在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?
答案 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)