Как сделать тупой клиент Web-сервиса на Java? - PullRequest
3 голосов
/ 07 января 2010

В настоящее время мы используем Axis2 на нашем предприятии. Наш проект включает в себя вызов нескольких веб-сервисов для диагностики неисправностей. Проблема в том, что очень часто у нас происходят изменения в WSDL (которые не представляют угрозы для жизни, так как новые типы данных и сервисы только добавляются, очень редко что-то отбрасывается), из-за чего нам также необходимо обновить наше приложение. По сути, у нас есть возможность получить новую копию WSDL, запустить ее через WSDL2java и использовать новые jar-файлы, запустить наши модульные тесты, упаковать новые jar-файлы и установить их в производство.

Хотя возможность создания заглушек в команде компиляции дает нам xmlbean-компоненты, с которыми мы можем легко работать в нашем коде уровня Java DAO, этот цикл развертывания компиляции из-за WSDL отнимает время команды. Мне было интересно, возможны ли какие-либо изменения? Существуют ли какие-либо API-интерфейсы Java, которые могут генерировать заглушки во время выполнения или обеспечивать вызов веб-службы без использования заглушек, но все же дают нам возможность работать с объектами Java, а не с документами-запросами ручной работы? Что-то вроде на этом тестовом сайте мыла . Я должен просто иметь возможность указать местоположение WSDL, и я должен просто получить объект, с помощью которого я могу получить доступ к документу (как запрос, так и ответ), а также иметь возможность изменить местоположение WSDL во время выполнения?

Не уверен, что этот тип поведения во время выполнения возможен в Java, поскольку объекты, генерируемые во время выполнения, будут иметь разные типы и т. Д. ?? не уверен ... Я видел некоторые примеры Groovy, которые приближаются к тому, что я хочу, но использование Groovy означает для нас архитектурное изменение ... и это немного сложно ... Есть ли какая-либо библиотека / API Java доступная?

Ответы [ 3 ]

1 голос
/ 07 января 2010

Eclipse Web Service Explorer создает клиентский интерфейс произвольного WSDL на лету. Поэтому я предполагаю, что то, что вы хотите сделать, возможно, если вы готовы к тому, чтобы ваше приложение использовало немного размышлений для вызова сервисов.

Поскольку Eclipse является открытым исходным кодом, вы можете изучить, как реализован проводник, и использовать идеи?

С другой стороны, можете ли вы автоматизировать сборку с помощью ant, чтобы при появлении нового WSDL он просто автоматически обрабатывался, а безболезненные изменения просто поглощались. Мой инстинкт заключается в том, что это лучший подход.

0 голосов
/ 06 апреля 2010
<code>import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

/**
 * This class creates SOAP clients from WDSL and a Java interface.
 * See http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXRPC5.html
 * <p>
 * Consider the following sample usage:
 * <pre>
    URL            wsdl = new URL("http://localhost:8080/calc/calc?wsdl");
    String  serviceName = "CalculatorWSService";
    String nameSpaceURI = "http://calculator.me.org/";
    String     portName = "CalculatorWSPort";
    Calculator     calc = SOAPClient.newInstance(wsdl, nameSpaceURI, serviceName, portName, Calculator.class);
 * 
* @author Curt * / public final class SOAPClient {/ ** * Создать новый SOAPClient, учитывая указанные параметры.* @param url, где WSDL - это * @param nameSpaceUri * @param serviceName * @param portName * @param face interface для использования * @ возврат объекта, реализующего интерфейс и подключенного к серверу * / public static TnewInstance (URL-адрес, String nameSpaceUri, String serviceName, String portName, Class face) создает исключение RemoteException {try {QName portQname = new QName (nameSpaceUri, portName);QName serviceQname = new QName (nameSpaceUri, serviceName);Service service = Service.create (url, serviceQname);T remote = service.getPort (portQname, face);T proxy = face.cast (удаленный);возврат прокси;} catch (Throwable t) {String message = "Подключение к URL =" + url + "пространство имен URI =" + nameSpaceUri + "имя службы =" + serviceName + "interface =" + face + "port =" + portName;бросить новое RemoteException (message, t);}} / ** * Не указывайте portName и полагайте, что служба сделает это.* / public static T newInstance (URL-адрес, String nameSpaceUri, String serviceName, Class face) генерирует MalformedURLException, RemoteException {QName serviceQname = new QName (nameSpaceUri, serviceName);Service service = Service.create (url, serviceQname);T remote = service.getPort (face);T proxy = face.cast (удаленный);возврат прокси;}}

Недокументированный класс Service может предоставить то, что вы ищете.

0 голосов
/ 07 января 2010

Не совсем тупой, но немного более независимый Spring's JaxWsPortProxyFactoryBean . Вы предоставляете интерфейсу сервиса методы, которые фактически использует ваш код. Вы можете указать URL-адрес для подключения, используя свойство. Если местоположение службы изменяется или добавляется больше методов (которые ваш код еще не использует), регенерация, компиляция или упаковка не требуются.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...