Проверка файла свойств Java


Мое приложение Java загружает файл свойств при запуске, который содержит пары ключ-значение. Я могу установить и получить ожидаемые свойства успешно.

Однако в таком виде файл свойств может содержать любое имя свойства, которое я хочу туда поместить. Я хотел бы иметь возможность ограничить свойства определенным набором, некоторые из которых являются обязательными, а другие необязательными.

Я могу вручную проверить каждое загруженное свойство против допустимого набора, но мне было интересно, есть ли еще элегантный способ сделать это. Например, возможно, каким-то образом объявить ожидаемые обязательные/необязательные свойства, чтобы при загрузке файла свойств возникло исключение, если обнаружено недопустимое или отсутствующее свойство. Похоже на то, что предлагает boost::program_options в C++.

2 2

2 ответа:

Я могу вручную проверить каждое загруженное свойство на соответствие допустимому набору, но я интересно, есть ли более элегантный способ сделать это. Например, возможно некоторый способ объявить ожидаемые обязательные / необязательные свойства, так что что при загрузке файла свойств возникает исключение, если обнаружено недопустимое или отсутствующее свойство.

Встроенный API JDK (java.утиль.Свойства ) не предлагают такого рода проверки.

Однако этого не должно быть трудно имплицировать свой собственный класс ConfigLoader, который делает это. Ваш класс может обернуть java.util.Properties и проверить данные после загрузки. Например, можно вести список обязательных и необязательных ключей (жестко закодированных или загруженных извне), а затем сверять список загруженных Ключей с этими списками.

Возможно, вы могли бы найти какую-то реализацию, которая делает это, но поскольку сама проверка будет специфичной для ваших потребностей в любом случае, а остальное довольно просто, я не думаю, что стоит охотиться для существующего решения.

Поскольку Properties уже является простой итерационной структурой, я бы просто выполнил вашу проверку против этого объекта. Ниже приведена простая проверка требуемых и необязательных параметров.

public static void testProps(Properties props, Set<String> required, Set<String> optional) {
    int requiredCount=0;
    Enumeration keys = props.keys();
    while (keys.hasMoreElements()) {
        String key=(String) keys.nextElement();
        if (required.contains(key)) {
            requiredCount++;
        } else if (!optional.contains(key)) {
            throw new IllegalStateException("Unauthorized key : " + key);
        }
    }
    if (requiredCount<required.size()) {
        for (String requiredKey : required) {
            if (!props.containsKey(requiredKey)) {
                throw new IllegalStateException("Missing required key : " + requiredKey);
            }
        }
    }
}