Scala 如何在play framework2.5中的对象内正确注入play.api.Configuration?

Scala 如何在play framework2.5中的对象内正确注入play.api.Configuration?,scala,dependency-injection,playframework,guice,typesafe-config,Scala,Dependency Injection,Playframework,Guice,Typesafe Config,我正在升级到play framework 2.5,我有一些对象很难将它们转换为类以使用依赖项注入,因此我使用了以下方法: object test { @Inject var config: Configuration = _ def portNumber = config.getInt("server.port") } 然而,在运行时,我得到了空指针异常,以前的代码是这样的: object test { def portNumber = Play.configuration.getInt("s

我正在升级到play framework 2.5,我有一些对象很难将它们转换为类以使用依赖项注入,因此我使用了以下方法:

object test {
@Inject var config: Configuration = _
def portNumber = config.getInt("server.port")
}
然而,在运行时,我得到了空指针异常,以前的代码是这样的:

object test {
def portNumber = Play.configuration.getInt("server.port")
}
但它是不可预测的,我必须用DI来改变它。
另一个问题是,如果我有一个特征,而不是一个对象,你可以在单例中设置配置,比如:

@Singleton
class ConfigForTest @Inject()(config: Configuration) {
  test.config = config
}
然后在
test
对象中从这里设置
config

因此,您的
test
对象如下所示:

object test {
   var config: Configuration = _
   def portNumber = config.getInt("server.port")
}
不要忘记初始化
模块中的
单例

class Module
  extends AbstractModule {

  @Override()
  override def configure(): Unit = {

    bind(classOf[ConfigForTest])
      .asEagerSingleton()
...
或者如Shweta所示,不用注射。由于您有一个Play应用程序,这就足够了:

import com.typesafe.config.ConfigFactory

object test {
   val portNumber = ConfigFactory.load().getInt("server.port")
}
这直接从类路径获取
application.conf

另一种方法是

import com.typesafe.config.ConfigFactory
val restConfig = ConfigFactory.load("rest.conf") //your conf file
val pageSize = restConfig.getInt("pagesize") //the value you want from conf file

我忘了将其添加到模块中/我还添加了一个没有注入的版本-请参阅我编辑的答案。我将尝试绑定,因为我正在动态创建application.conf文件,这意味着它是一个scala文件,但您必须确保不会过早调用Singleton!如果我得到的是一个特征而不是一个对象呢?感谢Stackoverflow是向上投票并接受答案-也比写评论快;)。它不起作用,可能是因为我正在使用play framework的yonf文件夹中的scala文件创建.conf文件。请创建一个文件,然后再试一次。