Я пишу клиентский инструмент, который использует 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 будет создан не только объект-человек, но и множество других частей, которые вы пытаетесь каким-то образом инкапсулировать, чтобы не разбить один класс?
Хорошая идея в целом, но: у меня есть классы веб-сервиса автогенерируемые согласно предоставленной WSDL из веб-сервиса. Если вы используете свой подход, мне нужно будет создать один класс-оболочку для сгенерированного класса, который я хочу использовать ... – membersound
Да, это правда - вам также придется писать новый класс в любом случае, чтобы обеспечить любую функциональность, потому что ваши сгенерированные классы на самом деле не имеют в них никакой функциональности. В этих классах вам придется обращаться ко всем членам данных сгенерированных классов, с которыми вы работаете явно. – user3221160