Scala应用中HOCON配置键替换环境变量失败的问题咨询
HOCON配置键的环境变量替换问题
这是预期行为吗?
是的,这是预期行为。HOCON的变量插值语法${...}仅支持在值的位置使用,默认不能直接用来定义对象的键,所以你在键的位置写${?HUMID_WEATHER_ID}会被解析器判定为语法错误,抛出你看到的异常。
解决办法
方案1:用HOCON的动态键语法修改配置文件
HOCON支持[key] = value的动态键写法,把环境变量插值放在括号里就能正常解析:
weathers { [${?HUMID_WEATHER_ID}] { temperature = 10 temperature = ${?HUMID_WEATHER_TEMPERATURR} } [${?HOT_WEATHER_ID}] { temperature = 10 temperature = ${?HOT_WEATHER_TEMPERATURR} } }
这种写法会让解析器把括号内的环境变量值作为键,如果环境变量未设置,对应的配置块会被自动忽略(${?XXX}是可选变量,不存在时会被移除)。
方案2:代码层面处理动态键
如果没法修改配置文件,就先读取带占位符的配置,再在Scala代码里替换键:
- 先定义配置类:
import pureconfig._ import pureconfig.generic.semiauto._ case class WeatherConfig(temperature: Int) case class AppConfig(weathers: Map[String, WeatherConfig]) object AppConfig { implicit val weatherReader: ConfigReader[WeatherConfig] = deriveReader[WeatherConfig] implicit val appReader: ConfigReader[AppConfig] = deriveReader[AppConfig] }
- 读取配置后替换键:
val rawConfig = loadConfigOrThrow[AppConfig] val humidKey = sys.env.get("HUMID_WEATHER_ID") val hotKey = sys.env.get("HOT_WEATHER_ID") val finalWeathers = rawConfig.weathers.flatMap { case ("humid_placeholder", cfg) => humidKey.map(_ -> cfg) case ("hot_placeholder", cfg) => hotKey.map(_ -> cfg) case other => Some(other) } val finalConfig = rawConfig.copy(weathers = finalWeathers)
这里需要你先在application.conf里用固定占位符(比如humid_placeholder)作为键,再用环境变量值替换它们。
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

