scala - scala案例类中的Google Guice字段注入(inject)

标签 scala playframework dependency-injection guice

我正在使用 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/

相关文章:

java - spring - 将属性注入(inject)到 pojo 类

ios - 使用工厂类来实例化相关具体类组

scala - 如何获取固定大小为 8 字节的 Long 值的 byteArray

mongodb - 同一服务器上是否可以有两个不同版本(1.2.5 和 2.0.4)的 Play Framework ?

java - 只与 Hibernate 建立双向关系可以吗?

javascript - 将 angularjs 应用程序拆分为具有路由依赖项注入(inject)的组件

针对变量的 Scala 匹配函数

scala - 如何将元组的元组转换为 map

java - scala 运算符作为 java 中的方法

java - 尽管 autoApply=false 并且属性未使用 @Convert 注释,但仍应用 JPA 属性转换器