1

我正在使用 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 识别为“未使用”,当触发“优化导入”或启用“动态优化导入”时,导入会自动删除。根据这个线程(接受的答案对我不起作用),我们可以使用“将导入标记为始终使用...”来解决这个问题,但这不是一个理想的解决方案,因为其他团队成员必须为每个项目做同样的事情或者我们应该将 .idea 提交给 VCS(我想避免)。

我附上了我的测试截图(依赖关系pureconfig.generic.auto._已经被标记为一直使用): 在此处输入图像描述

4

1 回答 1

3

是的你可以。查看文档 - 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"))

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

于 2019-05-31T15:58:01.293 回答