Scala中使用Typesafe Config解决多配置文件变量替换问题
问题原因
你遇到的报错是因为调用ConfigFactory.load("sharedlibapplication.conf")时,默认会自动解析配置里的占位符,但这时internalConsulConfig还没合并进去,找不到${logger.elasticsearch.servers.prod.host}对应的变量,导致解析失败。
修复方案
有两种可行的修复方式:
方式一:先加载未解析的配置,合并后统一解析
修改代码,先以不自动解析的方式加载配置文件,合并两个配置后再执行解析:
class ScalaCentralSharedLibConfigManager() { val configString = """ |logger { | elasticsearch { | servers { | prod { | host = "http://example.com" | } | } | } |} """.stripMargin val internalConsulConfig: Config = ConfigFactory.parseString(configString) // 加载配置文件但不自动解析占位符 val rawSharedConfig: Config = ConfigFactory.parseResources("sharedlibapplication.conf") // 合并配置并统一解析所有占位符 val internalConfig: Config = rawSharedConfig.withFallback(internalConsulConfig).resolve() }
核心要点:
- 用
ConfigFactory.parseResources替代load,避免自动解析占位符 withFallback将internalConsulConfig作为后备配置合并,确保被引用的变量能被找到- 最后调用
resolve()完成所有占位符的解析
方式二:合并配置后再解析
直接合并两个配置源,再统一解析:
class ScalaCentralSharedLibConfigManager() { val configString = """ |logger { | elasticsearch { | servers { | prod { | host = "http://example.com" | } | } | } |} """.stripMargin val internalConsulConfig: Config = ConfigFactory.parseString(configString) // 合并两个配置源后解析 val internalConfig: Config = internalConsulConfig.withFallback(ConfigFactory.parseResources("sharedlibapplication.conf")).resolve() }
这种方式调整了合并顺序,同样能确保sharedlibapplication.conf中的占位符可以找到internalConsulConfig里的变量。
关键注意点
ConfigFactory.load()默认会自动调用resolve(),解析所有占位符,这是导致你报错的核心withFallback()的顺序很重要:如果两个配置有重复键,前面的配置优先级更高;如果需要引用后备配置的键,要把后备配置放在后面- 跨配置引用变量时,必须保证被引用的配置在解析前已经合并到配置树中
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

