Генерация клиентов веб-службы Axis2 - Типы без изменения клиента

StackOverflow https://stackoverflow.com/questions/205240

Вопрос

Возможно ли с помощью 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.developer.com/java/web/article.php/3863416/Using-Axis2-and-Java-for-Asynchronous-Web-Service-Invocation-on-the-Client-Side.htm

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 создавать классы данных как отдельные классы, а не как внутренние классы в заглушке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top