如何在scala中的TypeSafe配置中读取环境变量?

时间:2017-03-29 07:21:41

标签: scala typesafe-config

我正在尝试在scala中的typesafe配置中读取环境变量,配置光滑的数据库。这是我试过的

remote_test_db = {
  dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
  properties = {
    driver = "org.postgresql.Driver"
    url = ${?REMOTE_TEST_DB_URL}
    user = ${?REMOTE_TEST_DB_USERNAME}
    password = ${?REMOTE_TEST_DB_PASSWORD}
  }
  connectionPool = disabled
  keepAliveConnection = true
}

但是我收到了这个错误:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.flyhomes.mls_pull.dump.MlsProvider.main(MlsProvider.scala)
Caused by: com.typesafe.config.ConfigException$NotResolved: need to Config#resolve(), see the API docs for Config#resolve(); substitution not resolved: ConfigConcatenation(${?REMOTE_TEST_DB_USERNAME})
    at com.typesafe.config.impl.ConfigConcatenation.notResolved(ConfigConcatenation.java:51)
    at com.typesafe.config.impl.ConfigConcatenation.valueType(ConfigConcatenation.java:58)
    at slick.util.ConfigExtensionMethods$$anonfun$slick$util$ConfigExtensionMethods$$toProps$1$1.apply(GlobalConfig.scala:71)
    at slick.util.ConfigExtensionMethods$$anonfun$slick$util$ConfigExtensionMethods$$toProps$1$1.apply(GlobalConfig.scala:69)
    at scala.collection.Iterator$class.foreach(Iterator.scala:893)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
    at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at slick.util.ConfigExtensionMethods$.slick$util$ConfigExtensionMethods$$toProps$1(GlobalConfig.scala:69)
    at slick.util.ConfigExtensionMethods$.toProperties$extension(GlobalConfig.scala:78)
    at slick.util.ConfigExtensionMethods$.getPropertiesOr$extension(GlobalConfig.scala:64)
    at slick.util.ConfigExtensionMethods$.getPropertiesOpt$extension(GlobalConfig.scala:84)
    at slick.jdbc.DataSourceJdbcDataSource$.forConfig(JdbcDataSource.scala:90)
    at slick.jdbc.DataSourceJdbcDataSource$.forConfig(JdbcDataSource.scala:86)
    at slick.jdbc.JdbcDataSource$.forConfig(JdbcDataSource.scala:48)
    at slick.jdbc.JdbcBackend$DatabaseFactoryDef$class.forConfig(JdbcBackend.scala:288)
    at slick.jdbc.JdbcBackend$$anon$3.forConfig(JdbcBackend.scala:33)
    at com.flyhomes.mls_pull.Databases$.remoteTestDb$lzycompute(Databases.scala:21)
    at com.flyhomes.mls_pull.Databases$.remoteTestDb(Databases.scala:21)
    at com.flyhomes.mls_pull.dump.MlsProvider$.<init>(MlsProvider.scala:18)
    at com.flyhomes.mls_pull.dump.MlsProvider$.<clinit>(MlsProvider.scala)
    ... 1 more

如何在此处访问环境变量?

1 个答案:

答案 0 :(得分:7)

从例外情况来看,您似乎需要致电resolve - 第3行:need to Config#resolve()。这实际上将替换每个变量。也许这会有所帮助:

val config = ??? // load config here
config.resolve() // force the substitution of variables

引用该课程的文档:

解决替换问题

替换是配置文件中的$ {foo.bar}语法,在规范中描述。解析替换用实际值替换这些引用。

在使用Config之前,必须调用resolve()来处理替换(虽然ConfigFactory.load()和类似的方法已经为你做了解决)。