【问题标题】:Is there a way to provide default values for env variables in a properties file with apache-commons?有没有办法在 apache-commons 的属性文件中为 env 变量提供默认值?
【发布时间】:2019-10-14 01:30:40
【问题描述】:

我正在使用org.apache.commons:commons-configuration2:2.5 从配置文件中读取配置参数。在我的application.properties 中,我想为环境变量指定默认值,以防其中一个尚未设置,例如像这样(类似于 Spring):

idp.username=${env:IDP_USERNAME:defaultUsername}

但是,虽然设置 env 变量可以正常工作,但指定这样的默认值是行不通的。不幸的是,我在commons-configuration2 文档中找不到与此相关的任何内容。如果不明确检查 Java 代码中的缺失值,这是否可行? Spring Boot 是否为此使用了某个我也可以使用的库?我不想仅仅为了拥有这种配置而使用 Spring 框架来膨胀我的简单应用程序。

我目前正在使用的简化代码示例(在这里,我显然可以检查我检索到的每个属性并将其替换为默认值,但我想避免这种情况并直接在配置文件中处理它):

private void loadConfigFile() {
        logger.info("Attempting to load `application.properties`...");
        Configurations configBuilder = new Configurations();
        try {
            Configuration props = configBuilder.properties(new File("application.properties"));

            // application config
            this.conf = new Config();
            this.conf.setAPIEndpoint(props.getString("api.endpoint"));
            this.conf.setMaxConnections(props.getInt("api.maxConnections"));
            ...

            logger.info("Config successfully loaded!");
        } catch (Exception e) {
            logger.error("Could not load `application.properties`: {}", e.getMessage());
            System.exit(1);
        }
    }

有什么建议吗?

【问题讨论】:

  • 你为什么要阅读带有公共配置的application.properties?这可以用 Spring Boot 轻松完成吗?
  • 如问题中所述,我不在此特定应用程序中使用 Spring Boot,并希望避免使用它。为方便起见,该文件仅命名为 application.properties

标签: java apache-commons-config


【解决方案1】:

Commons Configuration 提供了一种实现custom interpolation 的方法。 This answer 显示了一个示例。您的 Lookup 实现需要处理解析前缀之后的所有内容,然后进行查找并提供默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2011-01-31
    • 2022-01-05
    • 2020-08-24
    • 2013-03-31
    • 2015-01-31
    相关资源
    最近更新 更多