سؤال

In application.conf (in Play 2.0.4, sbt 0.11.3) I could use following substitutions:

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

After upgrade to Play 2.1.0 and sbt 0.12.2 and using this suggestion for Build.scala,

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

I get error when I do 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)

Based on Play Configuration documentation this kind of substitution should be supported:

Implementations must take care, however, to allow objects to refer to paths within themselves. For example, this must work:

bar : { foo : 42, baz : ${bar.foo} } Here, if an implementation resolved all substitutions in bar as part of resolving the substitution ${bar.foo}, there would be a cycle. The implementation must only resolve the foo field in bar, rather than recursing the entire bar object.

Any ideas how to fix this?

هل كانت مفيدة؟

المحلول

Your syntax is correct. It seems that you actually need to call resolve() as the error message says, to resolve substitutions. I guess in 2.0.x the play framework did this and provided a config that was already resolved this way. Now that the config API is used directly it needs to be resolved manually.

Add a call to resolve() in this line:

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

نصائح أخرى

AFAIK, my understanding of the doc is that you should use something like:

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

I did not test it...

And maybe it worked under 2.0.4 because of a bug ?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top