覆盖由apache公共PropertyConfiguration加载的重复属性键

时间:2017-09-22 10:14:46

标签: java apache-commons

我一直在寻找apache commons属性配置的属性,它可以覆盖属性文件中存在的重复键,而不是附加属性并像列表那样处理,但找不到任何此类属性。是否有相同的解决方法?

1 个答案:

答案 0 :(得分:0)

默认情况下,Apache commons属性配置将仅加载在属性文件中找到的第一个键值对。据我所知,它不提供您正在寻找的任何属性。由于PropertiesConfigurations调用resolveContainerStore,因此可以看到此行为(关键)方法。默认实现类似于

protected Object resolveContainerStore(String key)
    {
        Object value = getProperty(key);
        if (value != null)
        {
            if (value instanceof Collection)
            {
                Collection collection = (Collection) value;
                value = collection.isEmpty() ? null : collection.iterator().next();
            }
            else if (value.getClass().isArray() && Array.getLength(value) > 0)
            {
                value = Array.get(value, 0);
            }
        }

        return value;
    }

在此实现中,它从值列表返回给定键的第一个值,即value = Array.get(value,0);

如果希望覆盖属性以便返回最后加载的属性,则可以覆盖默认实现。这是我对上述功能的实现。

@Override        
protected Object resolveContainerStore(String key) {
                Object value = getProperty(key);
                if (value != null) {
                    if (value instanceof Collection) {
                        Collection collection = (Collection) value;
                        Iterator iterator = collection.iterator();
                        value = null;
                        while (iterator.hasNext()) {
                            value = iterator.next();
                        }
                    } else if (value.getClass().isArray() && Array.getLength(value) > 0) {
                        value = Array.get(value, Array.getLength(value) - 1);
                    }
                }
                return value;
            }