当前位置: 首页 > 知识库问答 >
问题:

Scala Play Guice使用注入器手动注入一个已将配置注入其构造函数的单例类

章锦
2023-03-14

使用play 2.5和guice,我成功地将Application ationConfig注入到一个单例类中,并引用其中的一个配置变量,

trait TMongoFactory{
  val SERVER: String
  val PORT: Int
  val DATABASE: String
  val connection: MongoClient
  val collection: MongoDB
}

@Singleton
class MongoFactory @Inject()(val configuration: Configuration) extends TMongoFactory{
  val SERVER = "localhost"         
  val PORT = 27017
  val DATABASE = configuration.underlying.getString("connectionString")
  val connection = MongoClient(SERVER, PORT)  
  val collection = connection(DATABASE)
}


class MongoModule extends AbstractModule {
  def configure() = {
    bind(classOf[TMongoFactory]).to(classOf[MongoFactory])
  }
}    

然后,我可以将这个单例传递给这样一个存储库类

@Singleton
class MongoRemainingAllowanceRepository @Inject()(MongoFactory: TMongoFactory) extends RemainingAllowanceRepository{
  val context = MongoFactory.collection("remainingAllowance")
  def save(remainingAllowance: RemainingAllowance): Unit ={
    context.save(RemainingAllowance.convertToMongoObject(remainingAllowance))
  }

这一切工作正常,正如预期的那样,但问题是我需要在测试套件中调用这个存储库,所以我不希望它必须接受任何参数(特别是注入的参数)。所以我试着把它改成在体内用注射器

@Singleton
class MongoRemainingAllowanceRepository extends RemainingAllowanceRepository{
  val injector = Guice.createInjector(new MongoModule)
  val mongoFactory = injector.getInstance(classOf[TMongoFactory])

  val context = mongoFactory.collection("remainingAllowance")
  def save(remainingAllowance: RemainingAllowance): Unit ={
    context.save(RemainingAllowance.convertToMongoObject(remainingAllowance))
  } 

这让人感觉它应该可以工作,并且编译得很好,但在测试或运行时会抛出一个错误

Could not find a suitable constructor in play.api.Configuration. Classes
must have either one (and only one) constructor annotated with @Inject
or a zero-argument constructor that is not private. at
play.api.Configuration.class(Configuration.scala:173) while locating
play.api.Configuration

很抱歉写了这么长的帖子,但我觉得我需要包括其中的大部分内容。有人知道为什么注射器会发生这种情况吗?我是否需要手动绑定配置?现在我正在引用自定义模块?

任何帮助感谢杰克

共有1个答案

薛承基
2023-03-14

当您创建类时,您可以自己传递配置。假设你需要keyapiKey及其值...

val sampleConfig = Map("apiKey" ->"abcd1234")
val mongoFactory = new MongoFactory(Configuration.from(sampleConfig))
 类似资料:
  • 我把下面的内容看做是构造函数和setter注入的区别之一。有人能用一些简单的例子解释一下下面的区别吗,我对术语完全功能对象和不完全对象有点困惑。 -

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj

  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 问题内容: 我的spring bean具有一个带有唯一强制性参数的构造函数,我设法用xml配置对其进行了初始化: 然后,我像这样使用此bean,并且效果很好。 但是我想用注释指定contructor arg值,例如 这可能吗 ? 提前致谢 问题答案: 首先,必须在bean定义中而不是在注入点中指定构造函数arg。然后,你可以利用spring的注释(spring 3.0) 就我所看到的问题而言,这可