Play 2.1 ConfigFactory.parseFile替换失败

时间:2013-02-13 02:41:38

标签: sbt playframework-2.1 typesafe-stack

在application.conf中(在Play 2.0.4中,sbt 0.11.3)我可以使用以下替换:

app {
  major = 0
  minor = 1
  revision = 62
  date = 0127
  version = ${app.major}.${app.minor}.${app.revision}.${app.date}
}

升级到Play 2.1.0和sbt 0.12.2并将此suggestion用于Build.scala后,

val conf = ConfigFactory.parseFile(new File("conf/application.conf"))

play clean时出错:

Caused by: com.typesafe.config.ConfigException$NotResolved: need to call resolve() on root config; tried to get value type on an unresolved substitution: ConfigSubstitution(${app.major}"."${app.minor}"."${app.revision}"."${app.date})
    at com.typesafe.config.impl.ConfigSubstitution.valueType(ConfigSubstitution.java:54)
    at com.typesafe.config.impl.DefaultTransformer.transform(DefaultTransformer.java:15)
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:118)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:135)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:140)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:108)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:146)
    at com.typesafe.config.impl.SimpleConfig.getString(SimpleConfig.java:188)
    at ApplicationBuild$.<init>(Build.scala:12)
    at ApplicationBuild$.<clinit>(Build.scala)

基于播放配置documentation,应支持此类替换:

  

但是,实现必须注意允许对象引用   他们自己的路径。例如,这必须起作用:

     

吧:{foo:42,           baz:$ {bar.foo}         这里,如果一个实现解决了bar中的所有替换,作为解析替换$ {bar.foo}的一部分,那么将会有一个   周期。实现必须只解析bar中的foo字段,   而不是递归整个条形对象。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您的语法是正确的。您似乎确实需要调用resolve(),如错误消息所示,以解决替换问题。我想在2.0.x中,play框架做到了这一点并提供了一个已经通过这种方式解决的配置。现在直接使用配置API,需要手动解决。

在此行中添加对resolve()的来电:

val conf = ConfigFactory.parseFile(new File("conf/application.conf")).resolve()

答案 1 :(得分:0)

AFAIK,我对该文档的理解是你应该使用类似的东西:

app {
  major = 0
  minor = 1
  revision = 62
  date = 0127
  version = ${major}.${minor}.${revision}.${date}
}

我没有测试它......

也许它因为一个bug而在2.0.4下工作了?