访问播放!2.0配置变量在application.conf中?


80

以前在玩!v1确实很容易在其中定义配置变量application.conf,然后像这样访问它们:

play.configuration("db.driver")

但是,现在我无法在文档中找到与v2中类似用途或适当替代品有关的任何内容。这样做的方法是什么?


1
对于新访客,此问题不仅限于Play 2.0。下面的其他播放版本也做出了多个其他答案。
saurabheights '17

Answers:


36

从Play 2.5开始,play.api.Play.current已弃用。您应该使用依赖项注入来注入EnvironmentConfiguration并使用它来读取配置值:

class HomeController @Inject() (configuration: play.api.Configuration) extends Controller {
  def config = Action {
    Ok(configuration.underlying.getString("db.driver"))
  }
}

查看Play文档以获取更多详细讨论。


5
感谢您提供更新的答案。我会将其标记为Play的未来用户的正确答案!2.x
crockpotveggies,2016年

1
谢谢,这应该很好用,直到再次更改Play。
卡思(Karth)'17年

那么如何在测试班级中做到这一点呢?例如Spces2?
全神贯注

115

与此等效的Play 2.0 Scala为:

Play.current.configuration.getString("db.driver")

您还需要 import play.api.Play

完整的文档在这里


非常感谢,我感谢链接。希望我们在API浏览器之外的Scala主页中看到更多文档:)
crockpotveggies 2012年

15
请注意,根据情况,您无法假设应用程序尚未启动,或者您不需要该应用程序,直到这部分代码为止。您可能会使用play.api.Play.maybeApplication.map(_.configuration.getString("db.driver"))
安迪·彼得雷拉

6
现在在Play 2.5中已弃用此功能。请参阅迁移指南
-Breavyn

57

适用于Play 2.0-在Java Controller中,您可以使用以下代码:

String optionValue = Play.application().configuration().getString("db.driver");

要获取变量,请使用以下命令:

@play.Play.application().configuration().getString("db.driver")

1
如何在JavaScript中使用它?
2014年

1
@premraj使用共享作为不可见div的HTML5数据属性。

22

Java版Play 2.3.2中,您可以使用以下com.typesafe.config.ConfigFactory选项:

Config conf = ConfigFactory.load();
String myFooBarConfiguration = conf.getString("foo.bar");

快速移动的API!


这是当前版本的Play ...(不使用DI)的正确答案。
toidiu '16

此解决方案独立于Play版本。它也可以在Scala中使用。如果他们要更改该访问点,则可能取决于HOCON版本。
帕特里克·绍斯

6

Play 2.3 [.8] / Java中测试的另一种方法可以从application.conf中访问值:

要检查Play版本,请检查文件项目/插件。包含“ sbt-plugin”的行应具有类似“ 2.3.8”的版本规范。

例如,如果application.conf包含以下行

myConfigStringValue=abc
myConfigBooleanValue=true

可以从Java文件/类中查询该值,例如

import play.Configuration;
...
String myString = Configuration.root().getString("myConfigStringValue");
Boolean myBoolean = Configuration.root().getBoolean("myConfigBooleanValue");

如果未找到值,则get ...方法将返回null,还有get ...方法将默认值作为参数。

有关详细信息,请参见 https://www.playframework.com/documentation/2.3.x/api/java/index.html

并检查class play.Configuration。


5

在Play Scala 2.3.x和2.4.x中,要从中读取值conf/application.conf,您可以执行以下操作:

import play.api.Play.current
...
current.configuration.getString("db.driver")

4

在Play 2.0.1 Java中,您需要执行以下操作:

import play.Application.*;
...
String optionValue = play.Play.application().configuration().getString("my.config");

3

在Play 2.1中,Scala首先,您必须 import play.api.Play Play.current.configuration.getString("varibale name")



2

如果您使用的是Play Scala,则在搜索了一些最佳实践后,我发现这种方法最合适。为此,我注入了配置,然后像这样访问我的配置密钥:

import play.api.Configuration

class myClass @Inject()(
  config: Configuration
) {
  val configValue: String = config.underlying.getString("configKey")
}

这样,您不会得到Option,而是得到String。如果不可用,则会引发异常:

Error injecting constructor, com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'configKey'

主要目标是避免@peoplemerge已经提到的纯get解决方案,而如果None则抛出特定异常。


1

作为@Inject对此处所有答案的很小贡献/改进,您无需调用config.underlying实现。您可以直接使用config.getString

例:

@Singleton
class RESTSessionChecker @Inject()(
    implicit override val conf: Configuration)
    extends Filter {

   val MAX_CONCURRENT_REQUESTS = conf.getString("MAX_CONCURRENT_REQUESTS").
         getOrElse("100").toInt
   ...

1

使用Scala在Play中有多种访问配置的方法

以下适用于Play 2.7.x

选项1:带DI

import play.api.Configuration
.... other imports ...

class MyActor @Inject()(config: Configuration) extends Actor  {
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

选项2:不带DI

import play.api.Configuration
.... other imports ...

class MyActor() extends Actor {
 val config = new Configuration(ConfigFactory.load("application.conf")) // application.conf is optional 
 println(config.get[String]("akka_actor_custom_dispatcher"))
 println(config.get[String]("akka_actor_custom_dispatcher")) // w/o optional
 println(config.getOptional[Int]("value_1").getOrElse(2))    // with optional 
 .....
 }

如何参加@Inject()考试班?
全神贯注

@rapt我建议您看一下playframework.com/documentation/2.8.x/…。基本上,您需要覆盖测试期间使用的Play应用程序。执行此操作时,GuiceApplicationBuilder您将有机会覆盖默认绑定。除此之外,您现有的Play组件将按预期实例化。
尼克·雅各布斯

0

正如其他人提到的,您需要导入play.api.Play.current。然后,如果您运行:

current.configuration.getString("db.driver")

在2.3.x / scala 10上,您将获得

type mismatch; 
found   : Option[String]
required: String

如果这是强制性的,那么它将起作用:

url = current.configuration.getString("db.driver").get

有人建议一个更好的答案吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.