Конфигурации многоразовые чтения для Java


Это связано с вопрос, который я разместил на переполнение стека. Консенсус был использовать JAXB, что я и сделал.

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

В попытке сделать многоразовый код, я добавил параметр универсального типа. Однако, это вызывает некоторые yuckiness для пользователя, так как он требует пользователей в тип класса. (Это не должно быть необходимым, но из-за реализации на Java дженериков, нет простого способа вокруг этого).

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

package com.eztech.config;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

import com.eztech.xml.XmlUtils;

public class JAXBConfigurator<T> {

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

    /**
     * Parses Xml and reads configuration from Document element. Using this method 
     * assumes that the configuration xml starts at the top of the xml document.
     * @return 
     * @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");


783
4
задан 14 декабря 2011 в 06:12 Источник Поделиться
Комментарии
1 ответ

Две вещи, которые полезно знать о JAXB:


  • Вы можете комментировать частные методы и поля, JAXB не можете позвонить/изменять их. Это может помочь скрыть внутренние структуры данных от клиентов.

  • Маршаллер а также вызывается событие обратного вызова. Они могут помочь передачи устарела или сложных полей.

Только две небольшие заметки о код:


  1. Я бы назвал класс JaxbConfigurator. Строчные буквы легче читать. (Эффективная Java, второе издание, пункт 56: придерживаться общепринятых правил именования)

  2. Стоило бы проверять входные параметры в конструкторе, чтобы избежать последнего таинственный NullPonterExceptions:

    import static com.google.common.base.Preconditions.*;

    ...

    public JaxbConfigurator(final Class<T> toConfigure, final String xmlFilePath) {
    this.clazz = checkNotNull(toConfigure, "toConfigure cannot be null");
    this.filePath = checkNotNull(xmlFilePath, "xmlFilePath cannot be null");
    }


4
ответ дан 16 декабря 2011 в 01:12 Источник Поделиться