【问题标题】:Can pureconfig use camel case configpureconfig 可以使用驼峰式配置吗
【发布时间】:2019-10-17 06:48:01
【问题描述】:

我正在使用 pureconfig pureconfig lib 和 pureconfig-yaml 模块。一切都像一个魅力,我唯一的问题是我必须将属性名称从骆驼大小写转换为烤肉大小写。

来自现实世界的痛苦例子:

case class Config(log4JPath: String, registryURL: String, HOUR_FORMAT: String)

Yaml:
log-4-j-path: /conf/log4j.properties
registry-url: http://foo.com
hour-_-format: dd-mm-yy

我不想维护 2 种不同的案例类型并考虑如何从一种转换为另一种,我希望拥有纯复制和粘贴 scala 类 -> yaml 配置解决方案。有没有可能两边都实现驼峰式?

编辑:

我已经围绕 pureconfig lib 创建了一个包装器,它可以通过环境变量覆盖一些配置。客户应按以下方式使用包装器:

val conf: Config = ConfigLoader(file).load[Config]

但这还不够,客户需要提供 2 个导入:

// to find implicit reader
import pureconfig.generic.auto._
// to use Camelcase - as suggested from the answer
import ConfigLoader.productHint

如果包装器 (ConfigLoader) 可以处理导入并且它们不会由客户负责,那就太好了。 此外,导入被 IntelliJ IDE 识别为“未使用”,当触发“优化导入”或启用“动态优化导入”时,导入会自动擦除。根据this 线程(接受的答案对我不起作用),我们可以使用“将导入标记为始终使用...”来解决这个问题,但这不是一个理想的解决方案,因为其他团队成员必须这样做每个项目,或者我们应该将 .idea 提交给 VCS(我想避免)。

我附上了我的测试截图(依赖pureconfig.generic.auto._ 已经被标记为一直使用):

【问题讨论】:

    标签: scala pureconfig


    【解决方案1】:

    是的,你可以。看看documentation - field-mappings

    import pureconfig._
    import pureconfig.generic.auto._
    import pureconfig.generic.ProductHint
    
    // Case classes should be final ;)
    final case class Config(log4JPath: String, registryURL: String, HOUR_FORMAT: String)
    
    val yaml =
      """log4JPath: /conf/log4j.properties
        |registryURL: http://foo.com
        |HOUR_FORMAT: dd-mm-yy""".stripMargin
    
    implicit val indentityHint: ProductHint[Conf] =
      ProductHint[Conf](new ConfigFieldMapping {
        def apply(fieldName: String) = fieldName // Basically the identity.
      }) 
    
    loadYaml[Config](yaml)
    // res: ConfigReader.Result[Config] = Right(Config("/conf/log4j.properties", "http://foo.com", "dd-mm-yy"))
    

    (注意,这是在菊石中测试的,使用 pureconfig 0.11.0

    【讨论】:

    • 谢谢,它有效。一个缺点是我需要从调用加载的客户端声明隐式 - 将其添加到我的包装类中不起作用。因此,我已将隐式 def 添加到 Object 并从客户端代码中导入它。 Intellij 将此导入标记为未使用,因此我无法使用优化导入功能(与 pureconfig.generic.auto._ 相同)。
    • @TomasBartalos 对于未使用的导入,请查看this。对于第一部分,我没有很好地理解它。你能用一个例子来编辑你的问题吗,也许有更简单的方法。我认为您说您正在创建另一个用户将调用的库,您能否解释(在问题中)您的客户将如何给您打电话,他/她将提供什么以及您需要什么去做。
    • 我已经编辑了问题并对问题进行了更多解释
    • @TomasBartalos 抱歉,已经尝试了一段时间来解决您的问题,但不走运。您可以尝试在pureconfig gitter 频道中提问。
    • 无论如何,你帮了大忙,谢谢。顺便说一句,我找到了另一种强制camelCase的方法:implicit def productHint[T] = ProductHint[T](ConfigFieldMapping(CamelCase, CamelCase))
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2016-08-13
    • 2015-12-06
    • 2013-09-29
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多