Генерация клиента веб-службы Axis2 - типы без изменения клиента - PullRequest
3 голосов
/ 15 октября 2008

Возможно ли с помощью Axis2 и Eclipse сгенерировать клиент веб-службы и использовать его для типов java, которые уже есть в пакетах, вместо создания его собственных типов. Конечно, если у меня уже есть тип A, и он создает свой собственный тип A, я не могу просто присвоить переменную типа A переменной типа B.

wsdl создается из веб-службы, развернутой на сервере приложений. Если это невозможно сгенерировать, можно сгенерировать клиента из уже существующих файлов Java.

Ответы [ 6 ]

3 голосов
/ 16 октября 2008

Если вы действительно хотите повторно использовать существующие классы, вы можете напрямую вызывать API Axis2, не создавая клиента с помощью 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);
1 голос
/ 15 октября 2008

Вы генерируете клиент веб-сервиса из wsdl, правильно?

Единственное, о чем знает инструмент wsdl2java, - это информация в wsdl, поэтому он не будет знать ни о каких типах, которые вы уже создали.

Если вы можете получить информацию о типе в wsdl, вы можете заставить ее работать, хотя я никогда не пробовал.

Если вам нужен простой способ копирования из типа A в тип B, то вы можете попробовать BeanUtils.copyProperties , если совпадают установщики и получатели типов A и типа B.

0 голосов
/ 22 января 2013

В случае, если эта публикация все еще кому-то нужна, я читаю руководство по генерированию клиентов 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 создавать классы данных как отдельные классы, а не как внутренние классы в заглушке.

0 голосов
/ 20 мая 2010

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

Таким образом, вам не понадобятся никакие другие классы-заглушки для вызова какого-либо веб-сервиса, нужно только обрабатывать ответный XML. Вы можете конвертировать XML в POJO, используя библиотеки Castor или JAXB.

Это способ, которым вам не нужно каждый раз модифицировать ваш клиент для diff. веб-сервисы. Вы можете развиваться так, как будто вы предоставляете клиенту обработчик ответа извне. Так что для каждого отдельного веб-сервиса у вас будет 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

0 голосов
/ 19 ноября 2008

Если вы используете Eclipse в качестве своего идеала, то, что вам нужно: http://www.eclipse.org/webtools/. Это делает помимо других вещей именно то, что вы хотите.

0 голосов
/ 15 октября 2008

почти все проекты Java-сервисов проходят через это. Я не знаю, есть ли в мире .NET / C # более элегантное решение.

Как отмечал Майк, имеет смысл использовать BeanUtils.copyProperties.

BR
~ A

...