Показаны сообщения с ярлыком web service. Показать все сообщения
Показаны сообщения с ярлыком web service. Показать все сообщения

вторник, 15 июля 2014 г.

Deploy EJB 3 web service to Websphere Application Server 8.5.5

One of the EJB 3.x features is that you can expose stateless EJB as web service.
If you use Rational Application Developer you  can use the following procedure to expose EJB as web service:

  1. Annotate your EJB bean with the @WebService annotation, and any other annotations required for your implementation.
  2. Create JMS or HTTP router modules for the web service as described in: Creating web service router modules. New in WebSphere Application Server v8, if you package your EJB application in a WAR module, you do not need to create router modules.
  3. Publish the application to a server.
Well, I had EJB in web module, which was packaged in EAR. Surprisingly for me EJB started but web service was not exposed, but the conditions were fulfilled. Then I deploy just WAR file and web service becomes available.


Moral: learn and practice as much as you can and double check what is written in documentation. 

четверг, 14 февраля 2013 г.

Challenges in WS development


1) Work with large and user base.
Solution:
Audit & monitoring.
Multifactor authentication.

2) Long life cycle.
Solution:
Choose solution based on industry standards.

3) Robustness.
Solution:
Architect the solution that will work even if some of it components will go down.

4) Manageability.
Solution:
Take care at monitoring, backup, upgrade.

 5) Integration with legacy applications.
Solution:
Look for interface of other applications.

WS stack technologies review

Recently I started to invest time in learning of web services.
I have learnt the basics of WSDL 1.1.
Now I'm trying to understand other aspects of WS. Where are a lot of WS-* technologies. Some of them are obsolete, some are not supported. So the aim of this post is to understand the widely adopted specifications and the possible use cases for them.

четверг, 17 января 2013 г.

Axis 2 basic authentication on client

Some time ago I need to connect to web-service which use HTTP basic authentication. I had an Axis 2 client. So, here what I did:
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
auth.setPreemptiveAuthentication(true);
auth.setUsername(login);
auth.setPassword(password);
stub._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE,auth); 

Now you can connect to protected services.

четверг, 27 декабря 2012 г.

Make friends: Apache CXF client + WSS4J + CryptoPro

Many of you who worked with government webservices know that the information passed to the service should be signed with GOST algorithm. This leads to the use of CryptoPro library. So here is the interesting part. What I have:
  1. jdk 1.6.0.38 + JCP CryptoPro
  2. ready to use keystore
  3. wss4j 1.6.6
  4. apache cxf 2.6.1 
  5. XMLDSigRI.jar
Generate the client to webservice.
Then, configure the crypto.properties file for wss4j: org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type=HDImageStore
org.apache.ws.security.crypto.merlin.keystore.password=1234567890
org.apache.ws.security.crypto.merlin.keystore.alias=tester
org.apache.ws.security.crypto.merlin.keystore.file=c:/cert.store

Then, configure your client:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
          http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://cxf.apache.org/jaxws 
          http://cxf.apache.org/schemas/jaxws.xsd">
 <!-- The SOAP client bean -->
  <jaxws:client id="client"
                serviceClass="ru.my.IService"
                address="http://test/IService/IdentificationService.svc">
    <jaxws:inInterceptors>
      <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
    </jaxws:inInterceptors>
     <jaxws:outInterceptors>
         <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
         <ref bean="wss4jOutConfiguration" /> 
     </jaxws:outInterceptors>
   </jaxws:client>
 <bean id="wss4jOutConfiguration" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
  <property name="properties">
  <map>
  <entry key="action" value="Signature"/>
  <entry key="signaturePropFile" value="crypto.properties"/>
  <entry key="signatureKeyIdentifier" value="DirectReference"/>  
  <entry key="user" value="tester"/> 
  <entry key="signatureUser" value="tester"/>
  <entry key="passwordCallbackClass" value="ru.client.KeystorePasswordCallback"></entry> 
     <entry key="signatureDigestAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
        <entry key="signatureAlgorithm" value="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>       
      </map>
  </property>
</bean>
</beans>

Everything seems good, but your client won't work.
Here is the example of client:
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});

        ru.IService client = (ru.IService) context.getBean("client");

        ru.CryptoPro.JCPxml.XmlInit.init();

        if(!JCPXMLDSigInit.isInitialized()){
            JCPXMLDSigInit.init();
        }

        Result res = client.callMethod(123);


For this to work I had to patch WSS4j. Download the sources for WSS4j 1.6.6 and edit the file org.apache.ws.security.message.WSSecSignature.java. Find the init method and replace it with this code:
  private void init() {
        Provider xmlDSigProvider = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
        signatureFactory = XMLSignatureFactory.getInstance("DOM", xmlDSigProvider);//XMLSignatureFactory.getInstance("DOM");
        keyInfoFactory = KeyInfoFactory.getInstance("DOM", xmlDSigProvider);
    }

       
Compile the file and add the compiled class to the wss4j jar.
After this, I could successfully run the client.

воскресенье, 2 сентября 2012 г.

Сравнение Apache CXF и Spring WS

-->
Попробуем сравнить 2 известных фреймворка для написания веб-сервисов и клиентов к ним.
К этим фреймворкам относятся: Spring Web Services, Apache CXF.

Проект Apache CXF активно развивается, в то время как Spring WS представляет собой законченное решение. Архитектура Spring WS довольно простая, что при желании позволит разобраться в её исходном коде и поправить замеченные ошибки.
Я знаком с обоими фреймворками, но испробовал не все их возможности. Сравнение представлено в таблице ниже и представляет собой попытку свести информацию в табличный вид.
По итогам сравнения можно сказать следующее:
  1. Apache CXF обладает большим количеством возможностей по сравнению с Spring WS.
  2. В проекте, когда интерфейс WSDL довольно часто меняется, то проще использовать Spring WS.
  3. Обе библиотеки довольно просты в освоении, однако с CXF много времени можно потратить на настройке.
  4. Следует отметить, что с обоими библиотеками поставляется набор примеров.
  5. Выбор в пользу той или иной библиотеки необходимо делать исходя из требований к проекту, а также исходя из приверженности работы по стандарту 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.
Простота в использовании.
Крайне разрозненная. Трудно понять с чего стоит начинать, и где найти нужную информацию.
Наличие инструментов
Отсутствует.
  • генераторы кода WSDL to Java, WSDL to JavaScript, Java to JavaScript,
  • генераторы WSDL Java to WSDL, XSD to WSDL, IDL to WSDL, WSDL to XML
  • проверка WSDL.
Версионность сервисов
Через XSLT преобразование запроса. Возможность быстрого внесения изменений в интерфейс сервиса, что полезно при изменяющемся контракте.
Написание собственного перехватчика (http://cxf.apache.org/docs/service-routing.html).
Клиенты
Простой синхронный клиент, интеграция с http client.
Возможность создания клиента на javascript, асинхронного клиента.
Отказоустойчивость
Необходимо придумывать самому.
Возможность создания клиентов, использующих возможность работы с другим сервисом в случае отказа сервера.
Управление
Отсутствует
Поддержка JMX.
Тестирование сервисов
Поддержка для тестирования клиентов и сервисов.
Необходимо писать самому. Можно использовать локальный или in-VM транспорт.
Интеграция с IDE
Отсутствует.
Интеграция с Eclipse.


вторник, 21 августа 2012 г.

Apache cxf 2.6.1 и Eclipse (part 2)

В этой части я решил избавиться от зависимости в виде Eclipse и научиться генерировать веб-сервис с помощью CXF.

пятница, 6 июля 2012 г.

Пример клиента на Spring Web Service

Итак, вызов веб-сервиса выглядит следующим образом:

 /**  
  * Вызов веб-сервиса       
  * @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. Пример постараюсь выложить позже.

Несмотря на то, что новичкам будет непросто сходу разобраться в этой библиотеке, я бы рекомендовал потратить время на её освоение.