我正在使用 Scala 编写 Play 2.5 应用程序。我有以下代码:
@ImplementedBy(classOf[BarRepositoryImpl])
trait BarRepository {
def bar = //some actions
}
class BarRepositoryImpl extends BarRepository
case class Foo( /*some fields*/) {
@Inject private var barRepository: BarRepository = null
def foo1 = {
val a = barRepository.bar //here barRepository is always null
// some actions with 'a' and returning some result which depends on 'a'
}
}
我也有一个 Controller ,我也可以在其中注入(inject) BarRepository,但是通过构造函数并且在 Foo 类中的 val a = barRepository.bar 行中一切正常,我得到了 NullPointerException。有人可以帮助找出问题所在吗?案例类中是否禁止使用注入(inject)?
最佳答案
如果您不想使用 Guice 注入(inject)的注释和字段污染案例类签名,那么只需添加对需要它的方法的隐式依赖即可:
case class Foo( /*some fields*/) {
def bar1(someField: Int)(implicit barRepository: BarRepository) = {
// some code that interacts with barRepository
}
}
调用类必须将 BarRepository 作为隐式注入(inject)参数。例如。一个 Play Controller ,如:
@Singleton
class HomeController @Inject()(cc: ControllerComponents)
(implicit barRepository: BarRepository)
extends AbstractController(cc) {
def index() = Action { implicit request =>
val foo = Foo("field")
val bar = foo.bar1
// ...
}
}
关于scala - scala案例类中的Google Guice字段注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641265/