【问题标题】:How to replace spring property placeholders in a simple java program如何在一个简单的java程序中替换spring属性占位符
【发布时间】:2018-04-28 10:32:14
【问题描述】:

我正在使用 Java 和 Spring Boot 应用程序。我有一个属性文件,需要在运行时添加为 docker 映像的环境变量。某些属性在通过如下占位符使用时会通过现有环境进行过滤。

app.name=MyApp
app.description=${app.name} is a Spring Boot application

我正在编写一个示例 java 文件来读取这个属性文件并创建一个带有一些过滤属性的地图对象。在此过程中,如何将占位符替换为实际的属性值?

我尝试使用getProperty 方法查找密钥并替换。但我想避免查找硬编码的属性键名,以避免维护困难。 提前致谢。

【问题讨论】:

    标签: java properties-file


    【解决方案1】:

    我将创建一个新的Properties 后代,使用获取属性值并替换任何引用(如果有)的方法。

    类似这样的:

    class MyProperties extends Properties
    {
        // Constructors, as needed
        private Pettern p = Pattern.compile("\\$\\{([^}]+)\\}");
        public String getString(final String key)
        {
            final String value = getProperty(key);
            if (null == value)
                return null;
            final StringBuffer result = new StringBuffer();
            final Matcher m = p.matcher(value);
            while (m.find())
            {
                final String refKey = m.group(1);
                final String refValue = getProperty(refKey);
                m.appendReplacement(result, null == refValue ? refKey : refValue);
            }
            m.appendTail(result);
            return result.toString();
        }
    }
    

    【讨论】:

    • 完美运行...非常感谢您在第二行指出一个错字 private Pattern p = Pattern.compile("\\$\\{([^}]+) \\}");
    【解决方案2】:

    用编号标记替换命名标记并使用Java SE 的MessageFormat 类。它可以让你完全按照你的要求去做。

    假设 props 包含从您的文件加载的所有属性。

    MessageFormat.format((String) props.get("app.description"),((String) props.get("app.name"));
    

    这里是你的财产:

    app.description={0} is a Spring Boot application

    否则你需要编写一个自定义

    【讨论】:

    • 此代码段不会替换占位符值。它与 ${1} 相同
    • @Sathya 查看运行中的代码here。我最初添加了错误的占位符。编辑它
    • @babs 注意到了编辑。谢谢。但正如 Usagi 指出的那样,它仍然对键进行硬编码
    猜你喜欢
    • 2011-01-13
    • 2017-12-17
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多