Конфигурация Typesafe - анализировать из карты/файла и разрешать

Я могу разрешать замены при анализе конфигурации из строки, но не при анализе карты или файла.

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}

Когда я не разрешаю сразу, видно, что заполнители переменных на самом деле не обрабатываются одинаково:

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}"}))

Я мог бы просто преобразовать карту/файл в строку, но есть ли способ заставить библиотеку справиться с этим?


person Kombajn zbożowy    schedule 20.03.2017    source источник
comment
На странице Github есть проблема, которая более или менее спрашивает то же самое, с объяснением аналогично ответу Федерико ниже.   -  person Kombajn zbożowy    schedule 21.03.2017


Ответы (1)


Метод ConfigFactory.parseMap приводит к fromAnyRef, для нас важна следующая часть:

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

Он никогда не анализирует значение как ConfigReference, поэтому resolve не может работать.

Их обоснование может заключаться в том, что если вы «контролируете» структуру данных, то вы можете каким-то образом использовать интерполяцию строк scala.


Для parseFile ситуация проще. Файлы свойств Java не поддерживают замены ${}, тип файла угадывается по расширению файла (.properties).

Вы можете просто использовать, например, формат HOCON: вам просто нужно переименовать файл (например, test.conf), ${} замены должны работать из коробки.

Дополнительная информация здесь: HOCON

person Federico Pellegatta    schedule 21.03.2017