javaapache-config

apache PropertiesConfiguration doesn't resolve placeholders


Say that I have the following two configuration files:

File 1:

key1 = ${common.key1}
key2 = ${common.key2}

File 2:

common.key1 = value1
common.key2 = value2

And I have the following code:

import org.apache.commons.configuration.PropertiesConfiguration;
...
PropertiesConfiguration newConfig = new PropertiesConfiguration();
File configFile1 = new File("...paht to file 1");
File configFile2 = new File("...path to file 2");
newConfig.setDelimiterParsingDisabled(true);
newConfig.load(configFile2);
newConfig.load(configFile1);

Iterator<String> props = newConfig.getKeys();
while (props.hasNext()) {
    String propName = props.next();
    String propValue = newConfig.getProperty(propName).toString();
    System.out.println(propName + " = " + propValue);
}

I have the following output:

common.key1 = value1
common.key2 = value2
key1 = ${common.key1}
key2 = ${common.key2}

Why the placeholders are not resolved ?


Solution

  • See this page in the documentation, which says:

    Below is some more information related to variable interpolation users should be aware of:

    • ...

    • Variable interpolation is done by all property access methods. One exception is the generic getProperty() method which returns the raw property value.

    And that's exactly what you are using in your code.

    The API docs of getProperty() mentions this as well:

    Gets a property from the configuration. ... On this level variable substitution is not yet performed.

    Use other methods available in PropertiesConfiguration to get the actual, interpolated value. For example, call getProperties() on the PropertiesConfiguration to convert it to a java.util.Properties object and iterate on that instead.