【问题标题】:Guice and Play2 Singleton from trait来自特质的 Guice 和 Play2 Singleton
【发布时间】:2016-05-29 04:32:22
【问题描述】:

我正在使用 Play with Scala,我正在尝试创建一个单例,我想从它的特征而不是直接注入它。

例如:

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
}
@Singleton
class S3RepositoryImpl extends S3Repository {
}

但这失败并出现错误:

trait Singleton 是抽象的;无法实例化

我尝试了几种组合,它们的效果都一样。

我来自春天的背景,很自然吗?我是否遗漏了有关 Guice 如何处理此类注入的内容?

谢谢。

【问题讨论】:

  • 去掉@Singleton注解还能用吗?另外,能否请您发布完整的堆栈跟踪?
  • 是的,但那不是单身
  • 很奇怪。你也可以发布你的Module的代码吗?
  • import javax.inject.Singleton

标签: scala playframework playframework-2.0 guice


【解决方案1】:

正如@Tavian-Barnes 所指出的,解决方案是确保您具有以下导入:

import javax.inject.Singleton

【讨论】:

  • 天啊,这可以挽救生命。正是缺失的部分。
【解决方案2】:

我这里有一个“完整”的工作示例,只是希望我不是在说显而易见的......

package controllers

import play.api._
import play.api.mvc._
import com.google.inject._

class Application @Inject() (s3: S3Repository) extends Controller {
  def index = Action {
    println(s3.get)
    Ok
  }
}

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
  def get: String
}

@Singleton
class S3RepositoryImpl extends S3Repository {
  def get: String = "bla"
}

每当你用@Inject 标记一个类的构造函数时,Guice 将管理实例本身的注入。因此,如果您将您的课程标记为@Singleton,Guice 将创建并始终为您提供一个实例。没有人可以阻止您在代码中手动实例化一个类...您可以在 Play 详细了解它。

【讨论】:

  • 有趣的是,当您将工作示例中的 import com.google.inject._ 替换为 import com.google.inject.{ImplementedBy, Inject} 时,问题仍然存在。可能还有更多的东西要导入才能使这个神奇的工作,太糟糕了编译错误消息不清楚
  • 不知道为什么,只导入com.google.inject.{ImplementedBy, Inject, Singleton} 就足够了。因为这些是 Java 注释,所以没有 Scala 隐含魔法之类的......
【解决方案3】:

使用下面的导入,而不是import javax.inject.Singleton

import com.google.inject.{Inject, Singleton}

【讨论】:

    【解决方案4】:

    同时导入 Inject 和 Singleton。

    import javax.inject.{Inject, Singleton}
    

    不要使用:

    import com.google.inject.{Inject, Singleton}
    

    因为 play 框架需要 javax 导入

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多