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

Scala changing parquet path in config (typesafe)

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

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

符合预期。

您可以阅读有关 Merging config trees. Code run at Scastie 的更多信息。

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