2017-03-20 7 views
1

Je peux résoudre les substitutions lorsque j'analyse config à partir de la chaîne, mais pas lors de l'analyse de la carte ou du fichier.Typesafe config - analyser à partir de la carte/fichier et résoudre

import java.io.File 
import com.typesafe.config.{Config, ConfigFactory} 
import scala.collection.JavaConversions.mapAsJavaMap 

val s: String = "a = test, b = another ${a}" 
val m: Map[String, String] = Map("a" -> "test", "b" -> "another ${a}") 
val f: File = new File("test.properties") // contains "a = test\nb = another ${a}" 

val cs: Config = ConfigFactory.parseString(s).resolve 
val cm: Config = ConfigFactory.parseMap(mapAsJavaMap(m)).resolve 
val cf: Config = ConfigFactory.parseFile(f).resolve 

println("b from string = " + cs.getString("b")) 
println("b from map = " + cm.getString("b")) 
println("b from file = " + cf.getString("b")) 

> b from string = another test 
> b from map = another ${a} 
> b from file = another ${a} 

Quand je ne résous pas immédiatement il est visible que les espaces réservés variables ne sont pas vraiment traités de la même façon:

val cs: Config = ConfigFactory.parseString(s) 
val cm: Config = ConfigFactory.parseMap(mapAsJavaMap(m)) 
val cf: Config = ConfigFactory.parseFile(f) 

> cs: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another "${a}})) 
> cm: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another ${a}"})) 
> cf: com.typesafe.config.Config = Config(SimpleConfigObject({"a":"test","b":"another ${a}"})) 

Je pourrais peut-être simplement convertir carte/fichier à chaîne, mais est-il un moyen de faire que la bibliothèque le gère?

+0

Il y a un problème sur la bibliothèque [page Github] (https://github.com/typesafehub/config/issues/76) que plus ou moins la même demande, avec des explications similaires à la réponse de Federico ci-dessous. –

Répondre

3

La méthode conduisent ConfigFactory.parseMap-fromAnyRef, la partie pertinente pour nous est:

if (object instanceof String) 
    return new ConfigString.Quoted(origin, (String) object); 

Il ne parse la valeur ConfigReference, donc il n'y a aucun moyen le resolve pourrait fonctionner. Leur logique pourrait être que si vous "contrôlez" la structure des données, vous pouvez, d'une manière ou d'une autre, tirer parti de l'interpolation de chaînes de caractères. Pour la parseFile, la situation est plus facile. Les fichiers de propriétés Java ne prennent pas en charge les substitutions ${}, le type du fichier est deviné par l'extension de fichier (.properties).

Vous pouvez simplement utiliser, par exemple, le format HOCON: il vous suffit de renommer le fichier (par exemple test.conf), ${} substitutions devraient ensuite travailler hors-the-box.

Plus d'informations ici: HOCON