Créer un service Web "Somme"

Dans ce tutoriel, je vais vous montrer les différentes étapes de déploiement et de consommation d’'un service Web qui fait la somme de deux entiers :

Requis : 
 
- Apache Axis 1.4 
- Apache Tomcat 6.0
- Eclipse JEE Helios
- Java JDK
- AdminClient
- WSDL2Java
 
Instructions :
 
1 - Créer une classe Java "sommer.java" qui fait la somme de deux entiers :
 
public class sommer 
{
    public int getsomme(int a, int b) { return a+b; }
}
 
2 - Compiler la classe "sommer.java" :
 
"%JAVA_HOME%/bin/javac" sommer.java 
où JAVA_HOME est la racine de votre machine virtuelle JAVA.
 
3 - Copier la classe "sommer.java" puis la coller dans le répertoire %CATALINA_HOME/webapps/axis/WEB-INF/classes 
où CATALINA_HOME est la racine de Apache Tomcat.
 
4 - Créer le fichier de description du service web somme (WSDL) :
 
<?xml version="1.0" encoding="UTF-8"?>
 
<wsdl:definitions targetNamespace="http://127.0.0.1:8080/axis/sommer.jws" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://127.0.0.1:8080/axis/sommer.jws" xmlns:intf="http://127.0.0.1:8080/axis/sommer.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 
   <wsdl:message name="getsommeResponse">
      <wsdl:part name="getsommeReturn" type="xsd:int"/>
   </wsdl:message>
   <wsdl:message name="getsommeRequest">
      <wsdl:part name="a" type="xsd:int"/>
      <wsdl:part name="b" type="xsd:int"/>
   </wsdl:message>
   <wsdl:portType name="sommer">
      <wsdl:operation name="getsomme" parameterOrder="a b">
         <wsdl:input message="impl:getsommeRequest"
                        name="getsommeRequest"/>
         <wsdl:output message="impl:getsommeResponse"              
                        name="getsommeResponse"/>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="sommerSoapBinding" type="impl:sommer">
      <wsdlsoap:binding style="rpc"  
          transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="getsomme">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="getsommeRequest">
            <wsdlsoap:body  
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
                namespace="http://DefaultNamespace" use="encoded"/>
         </wsdl:input>
         <wsdl:output name="getsommeResponse">
            <wsdlsoap:body    
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"  
                namespace="http://127.0.0.1:8080/axis/sommer.jws"
                  use="encoded"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="sommerService">
      <wsdl:port binding="impl:sommerSoapBinding" name="sommer">
         <wsdlsoap:address
            location="http://127.0.0.1:8080/axis/sommer.jws"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>
 
5 - Créer le descripteur de déploiement WSDD :
 
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="sommer" style="java:RPC">
<parameter name="className" value="sommer"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>
 
6 - Déployer le service Web avec l'outil AdminClient :
 
cd %AXIS_HOME%/WEB-INF/
java org.apache.axis.client.AdminClient deploy.wsdd
 
7 - Générer les classes Java nécéssaires pour la création du client avec l'outil WSDL2Java :
 
cd %AXIS_HOME%/WEB-INF/
java org.apache.axis.wsdl.WSDL2Java sommer.wsdl
 
8 - Créer la classe principale du Client Java :
 
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import _1._0._0._127.axis.sommer_jws.*;
 
public class SommerClient
{
 
public static void main(String[] args)
{
 
// Création du service depuis le endpoint
// SommerService correspond au nom du service dans le fichier "wsdl"
// c'est la balise : wsdl:service name="sommerService"
 
SommerService service = new SommerServiceLocator();
 
try
{
 
// Utilisation du service pour obtenir un stub qui implemente le SDI
// (Service Definition Type ; i.e. PortType).
// Pour le typage, c'est la balise : wsdl:portType name="sommer"
// Pour le getsommer(), le sommer correspond à la balise :
// wsdl:port binding="impl:sommerSoapBinding" name="sommer"
 
Sommer port = service.getsommer();
 
int s;
 
try
{
 
// Mise en oeuvre du service par application directe des méthodes
 
s = port.getsomme(2, 3);
 
System.out.println("2+3 = " + s);
 
}
 
catch (RemoteException e1)
{
e1.printStackTrace();
}
 
}
 
catch (ServiceException e)
{
e.printStackTrace();
}
 
}
 
}
 
9 - Exécuter le client Java pour consommer le service Web.
 
 

Commentaires

BIEN

Très bien le tuto !

(sans sujet)

wink

Erreur qui s'affiche

Ca coince avec le fichier wsdd, quand je le mets dans WEB-INF puis quand je fais java org.apache.axis.client.AdminClient deploy.wsdd ca génère une erreur sachant que tout a marché jusqu'à cette étape, peut être que le fichier wsdd n'est pas complet ou alors auriez vous des suggestions à me faire ?frown? Merci.

D'abord il faudra s'assurer

D'abord il faudra s'assurer que les variables d'environnement %JAVA_HOME%, %AXIS_HOME% et %CATALINA_HOME sont bien définies dans votre classpath.

Ensuite, je ne pense pas que le problème vient du fichier deploy.wsdd car j'ai utilisé le même fichier et la même démarche dans ce tutoriel pour créer le service Web.

Le fichier deploy.wsdd ainsi que le fichier .wsdl définissant le service doivent être placés dans le répertoire %AXIS_HOME%/WEB-INF/.

Si le problème n'est toujours pas réglé alors c'est très probablement une affaire de classpath.

Deux solutions possibles :

1- Copier les librairies qui se trouvent dans les répertoires %AXIS_HOME%/WEB-INF/lib et %CATALINA_HOME/common/lib et les coller dans le répertoire %AXIS_HOME%/WEB-INF/ (solution efficace mais pas propre).

2- Créer un fichier deploy.bat (toujours dans le même répertoire) qui contient les commandes suivantes :

set OLD_CLASSPATH=%CLASSPATH%
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\activation.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\mail.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\wsdl4j.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-discovery.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-logging.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\log4j-1.2.4.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\xerces.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet-api.jar
set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\naming-factory.jar
set CLASSPATH="%CLASSPATH%"
java - CLASSPATH="%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd
set CLASSPATH=%OLD_CLASSPATH%

Il faudra vérifier que les versions des librairies utilisées dans le script sont les mêmes que les vôtres sinon il faudra les renommer (celles qui se trouvent dans le script bien sûr).

Maintenant il ne reste plus qu'à exécuter ce script pour déployer le service Web. Si ça ne marche pas, essayez de remplacer (dans le script) "java - CLASSPATH="%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd" par "java - CLASSPATH=".;%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd".

Voila, bon courage.

Merci je vais voir

Merci pour ces precieuses explications, juste pour info je n'ai pas utilisé de variables d'environnement hormis JAVA_HOME que j'utilise pour compiler, pour les autres je préfère recopier les chemins. Concernant la copie des libs et bien je vais essayer cette solution, merci on reste en contact ;)

Oki. 

Oki. smiley

Publier un nouveau commentaire

  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Vous pouvez désactiver l'éditeur de texte avancé.

Plus d'informations sur les options de formatage

CAPTCHA visuel