Swiiwii
Swiiwii

Reputation: 47

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 ?

Upvotes: 1

Views: 963

Answers (2)

Sergey Bespalov
Sergey Bespalov

Reputation: 1766

It is also possible to use it in generic way with placeholders substitution like below:

config.get(Object.class, propName);

Unlike getProperty method the get method with Object.class parameter will return value of original class with variables interpolated.

Upvotes: 0

Jesper
Jesper

Reputation: 206926

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.

Upvotes: 1

Related Questions