Scala 如何在play framework2.5中的对象内正确注入play.api.Configuration?
我正在升级到play framework 2.5,我有一些对象很难将它们转换为类以使用依赖项注入,因此我使用了以下方法: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
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文件。请创建一个文件,然后再试一次。