2015-04-28 1 views
3

Je souhaite résoudre à nouveau un objet de configuration. par exemple si je définir cette config:Résoudre un objet de configuration scala

val conf = ConfigFactory.parseString(
    """ 
    | foo = a 
    | bar = ${foo}1 
    | baz = ${foo}2 
    """.stripMargin).resolve() 

Je vais obtenir ces valeurs:

conf.getString("bar") //res0: String = a1 
conf.getString("baz") //res1: String = a2 

donné l'objet conf, ce que je veux est d'être en mesure de changer la valeur de foo, et obtenir valeurs mises à jour pour bar et baz. Quelque chose comme:

val conf2 = conf 
      .withValue("foo", ConfigValueFactory.fromAnyRef("b")) 
      .resolve() 

et obtenez:

conf2.getString("bar") //res0: String = b1 
conf2.getString("baz") //res1: String = b2 

mais l'exécution de ce code entraînera:

conf2.getString("foo") //res0: String = b 
conf2.getString("bar") //res1: String = a1 
conf2.getString("baz") //res2: String = a2 

est-ce encore possible?

Répondre

4

Ce n'est pas possible une fois que resolve est appelée. En the documentation for resolve, il est dit:

Renvoie une configuration de remplacement avec toutes les substitutions résolus ... Résoudre une configuration déjà résolue est un non-op inoffensif.

En d'autres termes, une fois que vous appelez resolve, tous les substitions se produisent, et il n'y a aucune référence à la syntaxe de substitution HOCON d'origine.

Bien sûr, vous pouvez garder l'objet Config non résolues comme une variable, puis utilisez withValue:

val rawConf = ConfigFactory.parseString(
    """ 
    | foo = a 
    | bar = ${foo}1 
    | baz = ${foo}2 
    """.stripMargin) 
val conf2 = rawConf.withValue("foo", ConfigValueFactory.fromAnyRef("b")).resolve 
val conf = rawConf.resolve 

conf.getString("bar") //a1 
conf2.getString("bar") //b1, as desired 
+0

mon code est à un endroit où la configuration est déjà résolu, et je ne veux pas changer tout les autres endroits qui utilisent cet objet de configuration – lev

+0

@lev Alors ce n'est pas possible, je crois! –