Scala 在配置中更改镶木地板路径(类型安全)



目前我有一个这样的配置文件:

project {
inputs {
baseFile {
paths = ["project/src/test/resources/inputs/parquet1/date=2020-11-01/"]
type = parquet
applyConversions = false
}
}
}

我想在运行时将日期"2020-11-01"更改为另一个日期。我读到我需要一个新的配置对象,因为它是不可变的,我正在尝试这个,但我不太确定如何编辑路径,因为它是一个列表而不是一个字符串,它肯定需要一个列表,否则它会说我没有为镶木地板配置路径。

val newConfig = config.withValue("project.inputs.baseFile.paths"(0),
ConfigValueFactory.fromAnyRef("project/src/test/resources/inputs/parquet1/date=2020-10-01/"))

但我得到一个:

Error com.typesafe.config.ConfigException$BadPath: path parameter: Invalid path 'project.inputs.baseFile.': path has a leading, trailing, or two adjacent period '.' (use quoted "" empty string if you want an empty element)

设置新路径的正确方法是什么?

您有一个选择是覆盖整个数组:

import scala.collection.JavaConverters._
val mergedConfig = config.withValue("project.inputs.baseFile.paths",
ConfigValueFactory.fromAnyRef(Seq("project/src/test/resources/inputs/parquet1/date=2020-10-01/").asJava))

但是一种更优雅的方法(恕我直言),是创建一个 新config,并使用现有的作为后备。

例如,我们可以创建一个新config

val newJsonString = """project {
|inputs {
|baseFile {
|  paths = ["project/src/test/resources/inputs/parquet1/date=2020-10-01/"]
|}}}""".stripMargin
val newConfig = ConfigFactory.parseString(newJsonString)

现在合并它们:

val mergedConfig = newConfig.withFallback(config)

输出:

println(mergedConfig.getList("project.inputs.baseFile.paths"))
println(mergedConfig.getString("project.inputs.baseFile.type"))

是:

SimpleConfigList(["project/src/test/resources/inputs/parquet1/date=2020-10-01/"])
parquet

不出所料。

您可以阅读有关合并配置树的更多信息。代码在斯卡斯蒂运行。

我没有找到任何方法用withValue替换数组的一个元素。

最新更新