Question

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?

Était-ce utile?

La solution

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()

Autres conseils

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 ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top