Генерация клиентов веб-службы Axis2 - Типы без изменения клиента
-
03-07-2019 - |
Вопрос
Возможно ли с помощью Axis2 и Eclipse сгенерировать клиент веб-службы и заставить его использовать типы java, которые у вас уже есть в пакетах, вместо создания собственных типов.Причина в том, что, конечно, если у меня уже создан тип A, и он создает свой собственный тип A, я не могу просто присвоить переменную типа A переменной типа B.
wsdl генерируется из веб-службы, развернутой на сервере приложений.Если невозможно сгенерировать его из этого, можно ли было бы сгенерировать клиент из уже существующих java-файлов?
Решение
Если вы действительно хотите повторно использовать существующие классы, вы можете вызвать Axis2 API напрямую, не создавая клиент с помощью wsdl2java.Ниже приведен относительно простой код для вызова веб-службы.Вам просто нужно ввести конечную точку веб-службы, метод QName, ожидаемые возвращаемые классы и аргументы службы.Вы могли бы повторно использовать существующие классы в качестве возвращаемых значений или аргументов.
Если ваш веб-сервис довольно сложный, то вы можете обнаружить, что вам нужно углубиться в API, чтобы заставить этот подход работать.
serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference("http://myservice");
options.setTo(targetEPR);
QName methodName = new QName("ns","methodName");
Class<?>[] returnTypes = new Class[] { String.class };
Object[] args = new Object[] { "parameter" };
Object[] response = serviceClient.invokeBlocking(methodName, args,
returnTypes);
Другие советы
Вы создаете клиент веб-службы из wsdl, верно?
Единственное, о чем знает инструмент wsdl2java, - это информация в wsdl, поэтому он не будет знать ни о каких типах, которые вы уже создали.
Если вы сможете получить информацию о типе в wsdl, вы можете заставить его работать, хотя я никогда не пробовал.
Если вам нужен простой способ копирования из типа A в тип B, вы могли бы попробовать BeanUtils.Свойства копирования, до тех пор, пока установщики и добытчики типа A и типа B совпадают.
практически большинство проектов веб-сервисов Java проходят через это.Я не знаю, есть ли в мире .NET / C # более элегантное решение.
Как упоминал Майк, имеет смысл использовать BeanUtils.copyProperties .
БР,
~А
Если вы используете eclipse в качестве ide, это то, что вам нужно: http://www.eclipse.org/webtools/.Помимо всего прочего, он делает именно то, что вы хотите.
Вы можете напрямую использовать класс ServiceClient для вызова веб-службы, которая обеспечивает вызов только с использованием XML и возвращает XML-ответ.Для различных методов веб-сервиса вам необходимо преобразовать XML-ответ в какой-нибудь java POJO, чтобы использовать его.С вашей стороны должна быть выполнена только обработка ответов.это вы можете сделать, например, из XML в Map и т.д...
Таким образом, вам не понадобятся никакие другие классы-заглушки для вызова какой-либо веб-службы, вам нужно только обработать XML-ответ.Вы можете преобразовать XML в POJO, используя библиотеки Castor или JAXB.
Таким образом, вам не нужно каждый раз изменять свой клиент для diff.веб-сервисы.Вы можете разработать что-то вроде предоставления обработчика ответа клиенту извне.Так что для каждого отдельного веб-сервиса у вас будет разница.класс обработчика ответов, который является реализацией вашего интерфейса.
//common interface for response handlers...
//implement this for diff. web service/methods
public interface WSRespHandler{
public Object getMeResp(Object respData);
}
//pass particular handler to client when you call some WS
public class WebServiceClient {
public Object getResp(WSRespHandler respHandler) {
..
return repHandler.getMeResp(xmlData);
}
}
ссылка:
http://www.devdaily.com/blog/post/java/java-web-service-client-read-array-list/
Спасибо.
www.techlads.com
На случай, если этот пост все еще кому-то полезен, я прочитал руководство по созданию клиентов axis2: http://axis.apache.org/axis2/java/core/docs/userguide-creatingclients.html.
Похоже, что плагин Axis2 Eclipse настроен на вызов генерации кода ADB в интегрированном режиме (см. http://axis.apache.org/axis2/java/core/docs/adb/adb-howto.html), создавая таким образом внутренние классы в заглушке веб-сервиса.Я не знаю, возможно ли изменение режима генерации на расширенный режим (генерирование классов данных из класса-заглушки), но вы можете сделать это из командной строки, используя Wsdl2Java:
%AXIS2_HOME%\bin\WSDL2Java -uri <wsdl file path> -p <package name> -u
Опция -u указывает генератору кода ADB создавать классы данных как отдельные классы, а не как внутренние классы в заглушке.