2014-01-21 4 views
0

Я пишу клиентский инструмент, который использует soap xml webservices (используя CXF для автоматического создания классов из предоставленного wsdl). Интересно, какой дизайн лучше всего создавать запросы xml, которые я хочу отправить в веб-службы. Моя проблема заключается в том, что запрос на отправку должен быть сформирован из множества разных частей/объектов. Я ищу чистый способ структурирования создания этих частей, которые, наконец, образуют полный запрос.Архитектура для создания XML-запросов?

Запрос может вырасти до 200-500 строк XML, поэтому, вероятно, это плохая идея создать все это в одном классе.

Для иллюстрации своей цели, давайте предположим, что запрос требует Person объекта, и некоторый PARAMS должен быть установлен на этом объект, как имя, дата рождения, адрес и т.д. Я мог думать о следующих конструкциях:

1) статическая утилита, которая возвращает конструируемого XML часть

class XMLUtil { 
    public static PersonType createPerson(String name, String birthday, Address Address) { 
     //the xml person to send within the request 
     PersonType p = new PersonType(); 
     p.setName(name); 
     p.setBirthday(birthday); 
     p.setAddress(address); 
     //assume some more params, but the concept is clear I hope 
     return p; 
    } 
} 

2) статический утилита, которая добавляет построенную XML часть на запрос XML

class XMLUtil { 
    public static void addPerson(WebserviceReq req, String name, String birthday, Address Address) { 
     //create person as above 
     req.addPerson(p); 
    } 
} 

3) не статические службы

class XMLService { 
    private WebserviceReq req; 

    public XMLService(WebserviceReq req) { 
     this.req = req; 
    } 

    public void createPerson(String name, String birthday, Address Address) { 
     //create person as above 
     req.addPerson(p); 
    } 

    public WebserviceReq getWebserviceReq() { 
     return req; 
    } 
} 

использование:

1)

WebserviceReq req = new WebserviceReq(); 
req.addPerson(XMLUtil.createPerson("test", "2014-01-01", address)); 
req.send(); 

2)

WebserviceReq req = new WebserviceReq(); 
XMLUtil.addPerson(req, "test", "2014-01-01", address); 
req.send(); 

3)

WebserviceReq req = new WebserviceReq(); 
XMLService service = new XMLService(req); 
service.createPerson("test", "2014-01-01", address); 
service.getWebserviceReq(); 
req.send(); 

Какой подход вы предпочтете, если для запроса xml будет создан не только объект-человек, но и множество других частей, которые вы пытаетесь каким-то образом инкапсулировать, чтобы не разбить один класс?

ответ

0

То, что я сделал и использовал много раз большего эффекта заключается в следующем ...

Создать набор классов для каждого из типов элементов в XML - это включить следующее ...

Узел - базовый класс для всех элементов. Поддерживает настройку и получение атрибутов. Лист - базовый класс для любого элемента, содержащего значение (простые элементы) Ветвь - коллекция элементов листа. Доступ к детям осуществляется по индексу. Сущность - ветвь, которая позволяет доступ к своим детям.

В отличие от того, как вы делаете это сейчас, когда у вас есть компонент с именем Person, который имеет частные переменные и требует, чтобы код устанавливал и получал каждое значение, вы должны использовать экземпляр Entity и добавлять к нему экземпляры листа, например ...

Entity person = new Entity("Person"); 
person.add(new Leaf<String>("FirstName", "Rodney")); 
person.add(new Leaf<String>("LastName", "Barbati")); 

Власть здесь объясняется добавлением способности базовых классов писать себя как XML. Это дает вам возможность быстро создавать новые типы и не писать код для преобразования их в XML.

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

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

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

Если вы обнаружите, что пишете собственный код для вывода любой структуры XML, понимайте, что вам не нужно - есть лучшее решение.

BTW: Вышеприведенные классы предоставили бы неплохуе представление о структуре данных весной.

Good Luck,

Родни Barbati

+0

Хорошая идея в целом, но: у меня есть классы веб-сервиса автогенерируемые согласно предоставленной WSDL из веб-сервиса. Если вы используете свой подход, мне нужно будет создать один класс-оболочку для сгенерированного класса, который я хочу использовать ... – membersound

+1

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

Смежные вопросы