3

在 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 并将此建议用于 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)

根据 Play Configuration文档,应该支持这种替换:

然而,实现必须小心,以允许对象引用自身内部的路径。例如,这必须有效:

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

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

4

2 回答 2

3

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

resolve()在此行中添加调用:

val conf = ConfigFactory.parseFile(new File("conf/application.conf")).resolve()
于 2013-03-15T22:25:34.617 回答
0

AFAIK,我对文档的理解是您应该使用以下内容:

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

我没有测试它...

也许它因为错误而在 2.0.4 下工作?

于 2013-02-13T08:47:32.717 回答