Java: чтение конфигурации Xml и применение к объекту, какое простое и простое решение - PullRequest
2 голосов
/ 12 декабря 2011

В наших различных приложениях у нас есть множество разных методов, используемых для чтения информации о конфигурации Xml и применения ее к объекту Java.

Я ищу утилиту, которая, при наличии некоторого элемента Xml, автоматически берет любой дочерний элемент и устанавливает соответствующее свойство для объекта, который нужно настроить (и, конечно, обрабатывает любое преобразование данных из String в правильный стандартный тип данных Java ).

Я понимаю, что описываю что-то похожее на JAXB (который я использовал лишь немного, как часть проекта по сериализации / десериализации объектов в Xml), так что, может быть, это лучшее решение? Я просто не хочу, чтобы от меня требовалось добавлять аннотации к классу, и скорее было бы предположить, что любой установщик соответствует любому аналогично названному элементу Xml.

Буду признателен за любые рекомендации относительно того, каким должен быть стандартный способ сделать это. (И я в порядке, если люди скажут вернуться и прочитать документы JAXB, потому что это лучшее решение.)

Заранее спасибо.

Обновление: Я закончил с JAXB, хотя это было не совсем безболезненно. Основным недостатком является то, что он не учитывает регистр (когда вы имеете дело с файлами конфигурации, лучше не требовать совпадения в каждом конкретном случае). Еще одним недостатком является то, что вам нужно развернуть 3 дополнительные банки. Я закончил с этим кодом (может быть, есть что-то более элегантное):

public class JAXBConfigurator<T> {

private String filePath;
private Class<T> clazz;
public JAXBConfigurator(Class<T> toConfigure, String xmlFilePath) {
    this.clazz = toConfigure;
    this.filePath = xmlFilePath;
}

/**
 * @return Parses Xml and reads configuration from Document element. Using this method assumes that the
 * configuration xml starts at the top of the xml document.
 * @throws Exception
 */
public T createAndConfigure() throws Exception {
    return createAndConfigure(null);
}

/**
 * Selects specified element from the parsed Xml document to use as the base
 * for reading the configuration.
 * 
 * @param tagName
 * @return
 */
public T createAndConfigure(String tagName) throws Exception {
    Document doc = XmlUtils.parse(filePath);
    Node startNode;
    if (tagName == null) {
        startNode = doc;
    } else {
        startNode = XmlUtils.findFirstElement(doc, tagName);
    }

    return readConfigFromNode(startNode);
}

private T readConfigFromNode(Node startNode) throws JAXBException {
    JAXBContext context = JAXBContext.newInstance(clazz);
    Unmarshaller unmarshaller = context.createUnmarshaller();
    JAXBElement<T> configElement = unmarshaller.unmarshal(startNode, clazz);
    return configElement.getValue();
}

}

Класс привыкает так:

JAXBConfigurator<MyConfig> configurator = new JAXBConfigurator<Config>(MyConfig.class, xmlfilePath);
instance = configurator.createAndConfigure("MyXmlStartTag");

... что кажется достаточно многоразовым для большинства сценариев. Еще раз спасибо всем, кто откликнулся.

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

JAXB (JSR-222) является конфигурацией в порядке исключения. Это означает, что аннотации не требуются. Вам просто нужно добавить метаданные, чтобы переопределить правила по умолчанию:

Для примера

2 голосов
/ 12 декабря 2011

Выберите один из них: Castor, XMLBeans, JiBX, XStream и JAXB. Я бы порекомендовал JAXB или JiBX. И в случае, если вы используете Spring для других целей, вы также можете проверить Spring Object / XML mapping , который по сути является оберткой вокруг вышеупомянутых реализаций и обеспечивает согласованный API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...