0

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

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)

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

4

1 回答 1

1

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

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

正如预期的那样。

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

我没有找到任何方法将数组的一个元素替换为withValue.

于 2020-12-09T12:20:15.207 回答