我使用包含两个org.apache.commons.configuration.CombinedConfiguration实例的org.apache.commons.configuration.XMLConfiguration。一种用作默认配置,并与我的JAR一起部署,另一种是可以覆盖默认值的用户配置。

这是一些加载实例的代码:

    XMLConfiguration defaultConfig = new XMLConfiguration(defaultConfigFileURL);
    XMLConfiguration userConfig = new XMLConfiguration(extConfigFilePath);
    userConfig.setAutoSave(AUTO_SAVE);
    FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();
    strategy.setRefreshDelay(FILE_REFRESH_RATE);
    userConfig.setReloadingStrategy(strategy);
    userConfig.setExpressionEngine(new XPathExpressionEngine());
    defaultConfig.setExpressionEngine(new XPathExpressionEngine());
    this.config = new CombinedConfiguration();
    this.config.setExpressionEngine(new XPathExpressionEngine());
    OverrideCombiner oc = new OverrideCombiner();
    this.config.setNodeCombiner(oc);
    this.config.setThrowExceptionOnMissing(true);
    this.config.addConfiguration(userConfig, "USER");
    this.config.addConfiguration(defaultConfig, "DEFAULT");


使用AUTO_SAVE = trueuserConfig实例会自动将更改保存到目前可以正常使用的文件中。我的问题是,它多次添加了参数,因此配置文件看起来很混乱:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<fst_configuration>
<parameters>
        <WS_PASS_TO_SAP>true</WS_PASS_TO_SAP>
<PATH_CESA_DIR>C:\FST-RELEASE\FST\build\web\WEB-INF\cesa</PATH_CESA_DIR>
<PATH_ERIC_WORK_DIR>C:\FST-RELEASE\FST\build\web\WEB-INF\eric</PATH_ERIC_WORK_DIR>
<PATH_HSQL_DB>C:\FST-RELEASE\FST\build\web\WEB-INF\db</PATH_HSQL_DB>
<PATH_HSQL_DB>C:\FST-RELEASE\FST\build\web\WEB-INF\db</PATH_HSQL_DB>
<CESA_CMD_VERSION>17566520</CESA_CMD_VERSION>
<PATH_HSQL_DB>C:\FST-RELEASE\FST\build\web\WEB-INF\db</PATH_HSQL_DB>
<CESA_CMD_VERSION>17566520</CESA_CMD_VERSION>
</parameters>
(...)


例如,我在启动时更改参数PATH_HSQL_DB。 3次启动后,参数会在分配给userConfig的文件中存储3次。

这是向userConfig实例添加参数的代码:

(...) // value is a String
String name = "PATH_HSQL_DB";
String keyString = String.format("/parameters/%s", name);
userConfig.addProperty(keyString, value);


我该怎么做才能避免这种情况?

最佳答案

您正在添加属性而不是设置属性。采用

String name = "PATH_HSQL_DB";
String keyString = String.format("/parameters/%s", name);
userConfig.setProperty(keyString, value);


添加属性不会删除现有属性,而设置则会删除现有属性。


addProperty
setProperty

09-09 21:13