Apache Commons Configuration验证属性文件

时间:2016-02-22 18:13:23

标签: java validation properties-file apache-commons-config

我正在使用Apache Commons ConfigurationPropertiesConfiguration。 我的应用程序在启动后立即加载配置文件,如下所示:

public PropertiesConfiguration loadConfigFile(File configFile) throws ConfigurationNotFoundException {
        try {
            if (configFile != null && configFile.exists()) {
                config.load(configFile);
                config.setListDelimiter(';');
                config.setAutoSave(true);
                config.setReloadingStrategy(new FileChangedReloadingStrategy());
                setConfigLoaded(true);
            }
            else {
                throw new ConfigurationNotFoundException("Configuration file not found.");
            }

        } catch (ConfigurationException e) {
            logger.warn(e.getMessage());
            setDefaultConfigValues(config);
            config.setFile(configFile);
        }
        return config;
}

我的问题是,我如何验证configFile,因此我可以确定该文件中没有任何属性丢失,稍后在我的代码中我没有获得NullPointerException时试图访问属性,例如:

PropertiesConfiguration config = loadConfig(configFile);
String rootDir = config.getString("paths.download"); // I want to be sure that this property exists right at the app start

我在文档或谷歌中没有找到任何内容,只是关于XML验证的内容 目标是在程序启动时向用户提供配置文件已损坏的反馈。
properties-file没有内置机制?

1 个答案:

答案 0 :(得分:1)

如果将密钥传递给其中一个未映射到现有属性的get方法,那么配置对象应该执行什么操作?

  1. 在AbstractConfiguration中实现的默认行为是,如果返回值是对象类型,则返回null。

  2. 对于原始类型,因为返回值无法返回null(或任何其他特殊值),因此在这种情况下会抛出NoSuchElementException

    // This will return null if no property with key "NonExistingProperty" exists
    String strValue = config.getString("NonExistingProperty");
    
    // This will throw a NoSuchElementException exception if no property with
    // key "NonExistingProperty" exists
    long longValue = config.getLong("NonExistingProperty");
    
  3. 对于String,BigDecimal或BigInteger等对象类型,可以更改此默认行为:

    如果使用参数true调用setThrowExceptionOnMissing()方法,则这些方法的行为类似于其原始计数器部分,如果无法解析传入的属性键,则会抛出异常。

    对于Collection& amp;而言,情况有点棘手。数组类型,因为它们将返回空集合或数组。