Возможно ли, чтобы Axis2 и Eclipse создали клиент веб-службы и использовали ли они типы java, которые у вас уже есть в пакетах, вместо создания собственных типов. Разум, конечно, если у меня есть тип A, уже созданный и создающий его собственный тип AI, не может просто назначить переменную типа A переменной типа B.
Wsdl создается из веб-службы, развернутой на сервер приложений. Если это невозможно сгенерировать, можно было бы создать клиент из уже существующих java-файлов.
Если вы действительно хотите повторно использовать существующие classы, вы можете напрямую вызвать API Axis2 без генерации клиента с помощью wsdl2java. Ниже приведен некоторый относительно простой код для вызова веб-службы. Вам просто нужно заполнить конечную точку веб-службы, метод QName, ожидаемый class возврата и аргументы службы. Вы можете повторно использовать существующие classы как возвращаемые значения или аргументы.
Если ваш веб-сервис довольно сложный, вы можете обнаружить, что вам нужно углубиться в 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.copyProperties , если только сеттеры и геттеры типа A и типа B совпадают.
почти все проекты java webservices проходят через это. Я не знаю, есть ли в .NET / C # мир более элегантное решение.
Имеет смысл, как сказал Майк, использовать BeanUtils.copyProperties.
BR,
~ A
Если вы используете eclipse как ваш идеал, вам нужно: http://www.eclipse.org/webtools/ . Он делает что-то сверх того, что вы хотите.
Вы можете напрямую использовать class ServiceClient для вызова веб-сервиса, который обеспечивает вызов только с использованием XML и возвращает ответ XML. Для разных методов веб-службы вам необходимо преобразовать XML-ответ в некоторый Java-POJO для его использования. Для вас необходимо выполнить только обработку ответа. что вы можете делать, например, из XML в Map и т. д. …
Таким образом, вам не понадобятся какие-либо другие classы-заглушки для вызова любого веб-сервиса, только для обработки ответа XML. Вы можете преобразовать XML в POJO с помощью Castor или JAXB libs.
Таким образом, вы не должны каждый раз изменять свой клиент для diff. веб-сервисы. Вы можете развиваться подобно тому, как предоставлять обработчик ответа клиенту извне. Так что для каждого другого веб-сервиса у вас будет diff. class обработчика ответов, который представляет собой реализацию вашего интерфейса.
//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/
Благодарю.
В случае, если этот пост по-прежнему для кого-то полезен, я прочитал руководство по генерации клиентов 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 ), тем самым создавая внутренние classы в заглушке веб-службы. Я не знаю, возможно ли изменение режима генерации в расширенный режим (создание classов данных из classа stub), но вы можете сделать это с помощью командной строки Wsdl2Java:
%AXIS2_HOME%\bin\WSDL2Java -uri -p -u
Параметр -u указывает генератору кода ADB создавать classы данных как отдельные classы, а не внутренние classы в заглушке.