【问题标题】:Typesafe config - Setting placeholder values from a programTypesafe config - 从程序中设置占位符值
【发布时间】:2014-08-29 15:18:06
【问题描述】:

有什么方法可以动态更改 Typesafe 配置 文件的字段,使用源代码填充占位符?

例如,假设下面的简单配置语句

{
  values {
    string1: ${name1}
    string2: ${name2}
    string3: ${name3}
    string4: ${name4}
  }
}

正如HOCON 文档中所述以及earlier StackOverflow question 中提到的,可以使用环境变量和系统属性来实现这一点。

是否也可以直接从程序中执行相同的操作?例如,在Java 中,有一个类Constants 喜欢

public class Constants
{
  public static final String name1 = "A";
  public static final String name2 = "B";
  public static final String name3 = "C";
  public static final String name4 = "D";
}

并从该类填充配置字段?

HOCON 允许集成 Java 并在配置文件中执行代码,但显然无法从集成的 Java 代码中设置配置占位符。

【问题讨论】:

    标签: java scala akka typesafe-config hocon


    【解决方案1】:

    您可以通过在 Config 的实例上使用已解析占位符的配置调用 resolve(...) 来解析占位符。

    import com.typesafe.config.ConfigFactory;
    import com.typesafe.config.Config;
    
    public class ConfigOverrideFromCode {
        static public void main(String[] args) {
            String config = "system.administrator = ${who-knows}";
    
            Config original = ConfigFactory
                        .parseString(config)
                        .resolveWith(ConfigFactory.parseString("who-knows = jon"));
            System.out.println(original.getString("system.administrator"));
        }
    }
    

    【讨论】:

    • 感谢和 +1。我已经在其他问题中阅读过这种方法,但是如果配置文件中有多个字符串,则意味着您必须多次解析整个配置以替换相应的值。我希望有一种更“直接”的方法,但如果没有,可以使用您的解决方案。
    • 您不必多次解析整个配置。您可以将Config 传递给resolveWith,其中包含所有替换变量。除了解析字符串之外,还有更多创建Config 的方法。看看parse... 方法ConfigFactory 有什么。 Here is another sample 使用地图中的值演示多个占位符解析。我回答的重点是Config.resloveWith(...)。除此之外,发挥创意。 :)
    • 合并配置也需要多次解析。我仍然对这个解决方案不感兴趣。一种更好的方法可能是将 Java“环境”对象传递给配置,以便可以在嵌入式 Java 代码中设置占位符。然而,由于似乎没有这样的东西存在,而且显然没有其他人有更好的建议,我会听从你的建议。谢谢。 :-)
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2019-02-15
    • 2014-01-02
    相关资源
    最近更新 更多