【问题标题】:TypeSafeConfig and PureConfig - load a Map[String, Any] value from configTypeSafeConfig 和 PureConfig - 从配置中加载 Map[String, Any] 值
【发布时间】:2020-04-19 07:01:54
【问题描述】:

我正在尝试从配置文件中加载Map[String, Any]。目前是这样写的

map-name {
   stringValue = "firstValue"
   intValue = 1
   booleanValue = true
  }

Pureconfig 无法将此配置读取为Map[String, Any]。它仅在将 Any 替换为某些严格类型时才有效,但我想要比这更大的灵活性。

有没有办法解决这个问题?

【问题讨论】:

  • 拥有一个叫做typesafe的东西的想法是typesafe。为什么要Map[String, Any]?使用它会很困难且不安全。对于这种场景,pureconfing 允许您将这种对象读取为 case 类 的实例,因此您可以funal case class MapName(stringValue: String, intValue: Int, booleanVale: Boolean)
  • 关于类型安全的观点。我正在尝试为框架传递配置值。我这样做是为了让框架根据情况表现不同。 map 的键和值对应于框架配置的键和值。所有键都是字符串,但值可以是任何东西。我目前正在尝试创建这样的案例类FrameWorkConf(firstCircumstanceConfig: Map[String, Any], secondCircumstanceConfig: Map[String, Any]
  • 框架是否需要Map[String, Any]
  • 不,它需要一个 Config 对象。我将使用Map[String, Any] 创建Config。像这样config.withValue(mapKey, ConfigValueFactory.fromAnyRef(mapValue))
  • 你试过直接将配置读取为 Config 吗?

标签: scala config typesafe pureconfig


【解决方案1】:

有没有办法解决这个问题?

是的,有。你可以使用这种类型:Map[String, ConfigValue]

ConfigValue 来自其 Scala 文档:

一个不可变的值,遵循JSON 类型架构。

但是你可以使用ConfigObject 而不是Map[String, ConfigValue],因为这是同一回事。

您现在可以像 JSON-Object 结构一样处理它。

以下是一些示例:java-api-usage-examples

【讨论】:

    【解决方案2】:

    我只想替换现有配置的值。如果我从配置文件中读取整个配置,我将不得不指定所有其他值,即使是我不想更改的值。

    这是newConfig.withFallback(oldConfig)

    【讨论】:

      【解决方案3】:

      你可以有这样的东西:

      import scala.collection.JavaConverters._
      implicit val mapReader = pureconfig.ConfigReader[ConfigObject].map(co => co.unwrapped().asScala.toMap)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 2018-09-23
        • 2020-09-27
        • 1970-01-01
        • 2018-06-02
        • 2018-04-12
        相关资源
        最近更新 更多