It is a good practice to keep schema external to your wsdl.
In Spring WS documentation it is not clearly mentioned how to publish wsdl with external schema.
After some time searching google i managed to found the solution:
<!-- WSDL -->
<sws:static-wsdl id="BookingFacadeService" location="/WEB-INF/wsdl/BookingFacadeService.wsdl" />
<!-- Schema -->
<bean
id="BookingFacadeService_schema"
class="org.springframework.xml.xsd.SimpleXsdSchema">
<property
name="xsd"
value="/WEB-INF/wsdl/BookingFacadeService_schema.xsd">
</property>
</bean>
BookingFacadeService.wsdl is my wsdl which include the external schema BookingFacadeService_schema.xsd.
This blog is a collection of minds around linux, java, javascript, etc. Looking for great opportunities.
Показаны сообщения с ярлыком spring ws. Показать все сообщения
Показаны сообщения с ярлыком spring ws. Показать все сообщения
вторник, 9 апреля 2013 г.
воскресенье, 2 сентября 2012 г.
Сравнение Apache CXF и Spring WS
-->
Попробуем сравнить 2
известных фреймворка для написания
веб-сервисов и клиентов к ним.
К этим фреймворкам
относятся: Spring Web Services, Apache CXF.
Проект Apache CXF активно
развивается, в то время как Spring WS
представляет собой законченное решение.
Архитектура Spring WS довольно простая, что
при желании позволит разобраться в её
исходном коде и поправить замеченные
ошибки.
Я знаком с обоими
фреймворками, но испробовал не все их
возможности. Сравнение представлено в
таблице ниже и представляет собой
попытку свести информацию в табличный
вид.
По итогам сравнения
можно сказать следующее:
- Apache CXF обладает большим количеством возможностей по сравнению с Spring WS.
- В проекте, когда интерфейс WSDL довольно часто меняется, то проще использовать Spring WS.
- Обе библиотеки довольно просты в освоении, однако с CXF много времени можно потратить на настройке.
- Следует отметить, что с обоими библиотеками поставляется набор примеров.
- Выбор в пользу той или иной библиотеки необходимо делать исходя из требований к проекту, а также исходя из приверженности работы по стандарту JAX-WS.
Spring
WS
|
Apache
CXF
|
|
|---|---|---|
Поддержка
разработки типов сервисов
|
сверху-вниз
|
сверху-вниз,
снизу-вверх.
|
Обработка
входящих сообщений
|
DOM,
SAX, StAX, JDOMs, dom4j, XOM, JAXB, Castor, Apache XMLBeans,
XStream. Определение обработчика входящего
XML запроса на основе запроса, заголовка
SOAP Action или Xpath выражения.
|
DOM,
SAX, StAX, InputStream, JAXB 2.x, Aegis, Apache XMLBeans, Service
Data Objects (SDO), JiBX.
|
Поддержка
спецификаций
|
WS-Security,
WS-Addressing.
Интеграция
с Acegi Security.
|
JAX-WS,
JAX-RS, WS-Basic Profile, WS-Addressing, WS-Policy, WS-Reliable
Messaging, WS-Security, WS-SecurityPolicy, WS-SecureConversation,
WS-Trust (partial support).
|
Поддержка
транспорта
|
JMS,
Email, XMPP, HTTP, Embedded HTTP.
|
HTTP,
Servlet, JMS, In-VM and many others via the Camel
transport for CXF such as SMTP/POP3, TCP and Jabber.
|
Документация
|
Неплохая,
есть tutorial.
Простота
в использовании.
|
Крайне
разрозненная. Трудно понять с чего стоит начинать, и где найти нужную информацию.
|
Наличие
инструментов
|
Отсутствует.
|
|
Версионность
сервисов
|
Через
XSLT преобразование запроса. Возможность
быстрого внесения изменений в интерфейс
сервиса, что полезно при изменяющемся
контракте.
|
Написание
собственного перехватчика
(http://cxf.apache.org/docs/service-routing.html).
|
Клиенты
|
Простой
синхронный клиент, интеграция с http
client.
|
Возможность
создания клиента на javascript, асинхронного
клиента.
|
Отказоустойчивость
|
Необходимо
придумывать самому.
|
Возможность
создания клиентов, использующих
возможность работы с другим сервисом
в случае отказа сервера.
|
Управление
|
Отсутствует
|
Поддержка
JMX.
|
Тестирование
сервисов
|
Поддержка
для тестирования клиентов и сервисов.
|
Необходимо
писать самому. Можно использовать локальный или in-VM транспорт.
|
Интеграция
с IDE
|
Отсутствует.
|
Интеграция
с Eclipse.
|
пятница, 6 июля 2012 г.
Пример клиента на Spring Web Service
Итак, вызов веб-сервиса выглядит следующим образом:
В данном случае я отсылаю запрос в виде строки и принимаю обратно строку.
Основным классом, выполняющим грязную работу, является WebServiceTemplate.
При этом создание экземпляра этого класса можно сделать так:
Всё просто, не правда ли?
Правда, если мы хотим выставить таймаут на ожидание выполнения запроса, то необходимо в проект добавить библиотеку http commons 3.1.1 и изменить определение бина следующим образом:
Счастливой пятницы!
UPD 2012-07-14: Наткнулся на проблему, что по умолчанию
/**
* Вызов веб-сервиса
* @param request
* @return
*/
public String invove(String request){
StreamSource source = new StreamSource(new StringReader(request));
ByteArrayOutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);
webServiceTemplate.sendSourceAndReceiveToResult(url, source, result);
String resultStr = "";
try {
resultStr = new String(output.toByteArray(), "UTF-8");
} catch (UnsupportMultiThreadedHttpConnectionManageredEncodingException e) {
logger.error(e.getMessage(), e);
}
return resultStr;
}
В данном случае я отсылаю запрос в виде строки и принимаю обратно строку.
Основным классом, выполняющим грязную работу, является WebServiceTemplate.
При этом создание экземпляра этого класса можно сделать так:
Всё просто, не правда ли?
Правда, если мы хотим выставить таймаут на ожидание выполнения запроса, то необходимо в проект добавить библиотеку http commons 3.1.1 и изменить определение бина следующим образом:
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSenders">
<list>
<ref bean="httpSender" />
</list>
</property>
</bean>
<!-- add for thread safety -->
<bean id="connmanager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params" ref="connmanagerParams"/>
</bean>
<!-- Total to 300 connections -->
<bean id="connmanagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="maxTotalConnections" value="300"/>
</bean>
<bean id="httpParams" class="org.apache.commons.httpclient.params.HttpClientParams">
<!-- Timeout in milliseconds: in this case 10 seconds -->
<property name="soTimeout" value="10000" />
</bean>
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
<property name="params" ref="httpParams" />
<property name="httpConnectionManager" ref="connmanager"/>
</bean>
<bean id="httpSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
<constructor-arg>
<ref bean="httpClient"/>
</constructor-arg>
</bean>
Счастливой пятницы!
UPD 2012-07-14: Наткнулся на проблему, что по умолчанию
org.apache.commons.httpclient.HttpClient
не безопасен для использования в многопоточной среде. Чтобы это исправить, необходимо HttpClient передатьэкземплярMultiThreadedHttpConnectionManager
После этого Commons Http должен работать корректно в заданной конфигурации.
среда, 4 июля 2012 г.
Spring web services. Java doc.
Недавно я начал разбираться с новой для себя библиотекой - Spring Web Services. Скачал версию 2.1.0.
Оказалось, что эта версия не работает со Spring 2.5. Из недостатков дистрибутива можно отметить отсутствие javadoc. Однако после поисков мне удалось найти архив с javadoc по пути: http://repo1.maven.org/maven2/org/springframework/ws/spring-ws-core/2.1.0.RELEASE/spring-ws-core-2.1.0.RELEASE-javadoc.jar.
Также к недостатку можно отнести то, что при определённых условиях spring ws зависит от http client 3.1.1. Хотя http client уже давно имеет более свежую версию. Для меня было открытием, что spring ws не имеет встроенной возможности установить таймаут на ожидание обработки запроса в веб-сервис. Именно поэтому используется http client.
Что касается написания клиента, то здесь Spring ws предоставляет гибкие возможности. Например, можно посылать xml запросы в виде строк напрямую в сервис, а можно заставить spring ws самому заниматься преобразованием объектов в запросы и обратно. Мне, к сожалению, пришлось выбрать вариант работы с xml через строки, так как веб-сервис, с которым приходится работать, плохо документирован и определён. Поэтому часто приходится делать доработки клиента.
Подписывание xml также происходит довольно легко и быстро. Не надо тратить время на написание кода - всё можно сделать через файл конфигурации Spring. Пример постараюсь выложить позже.
Несмотря на то, что новичкам будет непросто сходу разобраться в этой библиотеке, я бы рекомендовал потратить время на её освоение.
Оказалось, что эта версия не работает со Spring 2.5. Из недостатков дистрибутива можно отметить отсутствие javadoc. Однако после поисков мне удалось найти архив с javadoc по пути: http://repo1.maven.org/maven2/org/springframework/ws/spring-ws-core/2.1.0.RELEASE/spring-ws-core-2.1.0.RELEASE-javadoc.jar.
Также к недостатку можно отнести то, что при определённых условиях spring ws зависит от http client 3.1.1. Хотя http client уже давно имеет более свежую версию. Для меня было открытием, что spring ws не имеет встроенной возможности установить таймаут на ожидание обработки запроса в веб-сервис. Именно поэтому используется http client.
Что касается написания клиента, то здесь Spring ws предоставляет гибкие возможности. Например, можно посылать xml запросы в виде строк напрямую в сервис, а можно заставить spring ws самому заниматься преобразованием объектов в запросы и обратно. Мне, к сожалению, пришлось выбрать вариант работы с xml через строки, так как веб-сервис, с которым приходится работать, плохо документирован и определён. Поэтому часто приходится делать доработки клиента.
Подписывание xml также происходит довольно легко и быстро. Не надо тратить время на написание кода - всё можно сделать через файл конфигурации Spring. Пример постараюсь выложить позже.
Несмотря на то, что новичкам будет непросто сходу разобраться в этой библиотеке, я бы рекомендовал потратить время на её освоение.
Подписаться на:
Комментарии (Atom)