Scala 来自trait的Guice和Play2单例

Scala 来自trait的Guice和Play2单例,scala,playframework,playframework-2.0,guice,Scala,Playframework,Playframework 2.0,Guice,我正在使用Play with Scala,我正在尝试创建一个单例,我想从它的特性而不是直接注入它 例如: @ImplementedBy(classOf[S3RepositoryImpl]) trait S3Repository { } @Singleton class S3RepositoryImpl extends S3Repository { } 但这样做失败了,出现了错误: 特质单体是抽象的;无法实例化 我试过几种组合,结果都一样 我来自春天的背景,那里很自然吗?我是否遗漏了Guice如

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

例如:

@ImplementedBy(classOf[S3RepositoryImpl])
trait S3Repository {
}
@Singleton
class S3RepositoryImpl extends S3Repository {
}
但这样做失败了,出现了错误:

特质单体是抽象的;无法实例化

我试过几种组合,结果都一样

我来自春天的背景,那里很自然吗?我是否遗漏了Guice如何处理这种类型的注射

谢谢。

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

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
标记类的构造函数时,GUI将管理实例本身的注入。因此,如果您将类标记为
@Singleton
,Guice将创建并始终只提供一个实例。没有人可以阻止您在代码中手动实例化类。。。如@Tavian Barnes所指出的,解决方案是确保您具有以下导入功能:

import javax.inject.Singleton

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

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

同时导入Inject和Singleton

import javax.inject.{Inject, Singleton}
避免使用:

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

as play框架需要javax导入

如果删除
@Singleton
注释,它能工作吗?另外,你能发布完整的stacktrace吗?是的,有,但这不是一个单独的问题。您还可以发布您的
模块的代码吗?
导入javax.inject.Singleton
有趣的是,当您在工作示例中将
导入com.google.inject.\u
替换为
导入com.google.inject.{ImplementedBy,inject}
时,问题仍然存在。可能还有更多的东西需要导入才能让这个神奇的东西发挥作用,但编译错误消息太糟糕了。不知道为什么,只导入
com.google.inject.{ImplementedBy,inject,Singleton}
。因为这些都是Java注释,所以没有Scala隐式的魔力……天哪,这拯救了生命。正是丢失的那一块。