禁止在类型安全配置中加载期间解析

时间:2015-05-08 17:20:07

标签: java scala typesafe-config

我想禁止解析a.b。我想从另一个配置中替换param。像这样:

val d = ConfigFactory.load(ConfigFactory.parseString(
    """
      |param = x
      |a.b = ${param}
    """.stripMargin))

val a = ConfigFactory.parseString("param = 1")

val result = a.withFallback(d).resolve()

在这种情况下,param获取值1,但a.b仍为x 我在加载配置ConfigResolveOptions.defaults().setAllowUnresolved(true)时尝试设置d,但这不起作用。

我怎样才能克服这个?

3 个答案:

答案 0 :(得分:3)

我在同样的事情上有点挣扎:尝试使用“后备”来覆盖值,当它被设计用于分层/合并配置时

假设我理解您的用例,我建议改为使用文件包含。

在我的application.conf我有默认值

a.b = "placeholder"

在底部我有以下内容

# Local overrides - for development use
include "local.conf"

最后在local.conf

param = 1
a.b = ${param}

最终结果是a.b将被1

覆盖

答案 1 :(得分:3)

问题是Config.load正在立即解决替换问题。如果你把它拿出来就像你想要的那样解决:

val p = ConfigFactory.parseString(
  """
    |param = x
    |a.b = ${param}
  """.stripMargin)

val a = ConfigFactory.parseString("param = 1")

val result = a.withFallback(p).resolve()

println(result.getString("a.b"))

打印1。

除非您想使用Config.load等,否则不需要使用reference.conf。如果您确实想使用Config.load,那么您应该在撰写完成后再使用withFallback使用 val p = ConfigFactory.parseString( """ |param = x |a.b = ${param} """.stripMargin) val d = ConfigFactory.load(p) val a = ConfigFactory.parseString("param = 1") val result = a.withFallback(p) val loaded = ConfigFactory.load(result) println(loaded.getString("a.b")) 将所有配置放在一起。

例如,这也打印1:

application.conf

或者,假设您include ConfigFactory.load()application.conf一起使用include "foo" (根据您的评论)。

如果foo.conf看起来像

a.b = ${param}

val a = ConfigFactory.parseString("param = 1") val app = ConfigFactory.load("application", ConfigParseOptions.defaults, ConfigResolveOptions.defaults.setAllowUnresolved(true)) val result = a.withFallback(app).resolve println(result.getString("a.b")) 看起来像

A.withFallback(B).withFallback(C)

然后打印1:

import csv

a=[['Lindsey Jessica <xyz@icloud.com>'], 
['Jonathan Bob <a@xyz.edu>'],
['Homer Simpson <b@xyz.edu>']]


mylist=[elem[0].split() for elem in a ]

"""Output[['Lindsey', 'Jessica', '<xyz@icloud.com>'], ['Jonathan', 'Bob', '<a@xyz.edu>'], ['Homer', 'Simpson', '<b@xyz.edu>']]"""

mylist1=[]
#removing '<' and'>' and creating a new list name mylist1
for elem in mylist:
    elem[2] = elem[2][1:len(elem[2])-1]
    mylist1.append(elem)
#writing to a csv file 
with open('out.csv', 'wb') as fp:
    myf = csv.writer(fp, delimiter=',')
    myf.writerows(mylist1)

通常,如果您希望A覆盖B以覆盖C,那么您应该使用function sum($array, $key){ isset($array[$key['stock_id']]) ? $array[$key[$array['select']]][$array['sum']] += $key[$array['sum']] : $array[$key[$array['select']]] = $key; return $array; }; //merge same stock_id and sum the quantity same stock id $sum_same_stock_id = array_reduce($test, "sum", array('select'=>'stock_id', 'sum' => 'quantity'));

答案 2 :(得分:0)

为我的问题找到了解决方法:

所以如果我有配置文件application.conf,它使用include来包含包含替换语法的配置文件和包含将要替换的配置值声明的文件。

val a = ConfigFactory.parseString(s"""param = 1""")
 val z = ConfigFactory.parseResources("application.conf") //this doesn't resolve substitutions

val result = a.withFallback(z).resolve().withFallback(ConfigFactory.load("application.conf"))