В наших различных приложениях у нас есть множество разных методов, используемых для чтения информации о конфигурации 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");
... что кажется достаточно многоразовым для большинства сценариев. Еще раз спасибо всем, кто откликнулся.