Exemple de services Web SOAP en Java avec Eclipse

Les services web SOAP en Java peuvent être développés de nombreuses manières. Nous avons appris les services web SOAP JAX-WS dans notre dernier tutoriel, aujourd’hui nous allons voir comment créer un service web SOAP et son programme client en utilisant Eclipse. Ici, nous n’utiliserons pas JAX-WS, mais Apache Axis qui est intégré dans Eclipse et offre un moyen rapide et facile de transformer une application en un service web Java, ainsi que de créer des stubs clients avec une page JSP de test à des fins de test.

Services web SOAP en Java

J’utilise Eclipse Mars Release (4.5.0) pour ce tutoriel, mais je pense que ces étapes fonctionneront également avec les versions plus anciennes d’Eclipse. Assurez-vous également d’avoir ajouté Apache Tomcat ou tout autre conteneur de servlet en tant que serveur dans Eclipse. Commençons maintenant avec notre implémentation du service web Eclipse.

Exemple de service web SOAP

Commençons avec notre exemple de service web SOAP dans Eclipse. Tout d’abord, nous allons créer un simple Projet Web Dynamique dans Eclipse qui contiendra la logique métier de notre application. Cliquez sur le bouton Suivant ci-dessus, et vous arriverez à la page suivante pour fournir le nom de votre projet web et Runtime Cible. Remarquez que j’utilise Apache Tomcat 8, vous pouvez également utiliser tout autre conteneur de servlet standard. Cliquez sur Suivant et vous devrez fournir « Racine du contexte » et l’emplacement du répertoire de contenu. Vous pouvez les laisser par défaut. Cliquez sur Terminer et Eclipse créera le squelette du projet pour vous. Commençons avec notre logique métier. Donc, pour notre exemple, nous aimerions publier un service web qui peut être utilisé pour ajouter/supprimer/obtenir un objet. La première étape consiste à créer un bean modèle.

package com.journaldev.jaxws.beans;

import java.io.Serializable;

public class Person implements Serializable{

	private static final long serialVersionUID = -5577579081118070434L;
	
	private String name;
	private int age;
	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	@Override
	public String toString(){
		return id+"::"+name+"::"+age;
	}

}

Remarquez que ci-dessus est un simple bean Java, nous implémentons l’interface Serializable car nous allons le transporter sur le réseau. Nous avons également fourni une implémentation de la méthode toString qui sera utilisée lorsque nous imprimerons cet objet côté client. La prochaine étape consiste à créer des classes de service, donc nous aurons une interface comme PersonService et sa classe d’implémentation simple PersonServiceImpl.

package com.journaldev.jaxws.service;

import com.journaldev.jaxws.beans.Person;

public interface PersonService {

	public boolean addPerson(Person p);
	
	public boolean deletePerson(int id);
	
	public Person getPerson(int id);
	
	public Person[] getAllPersons();
}

Ci-dessous se trouve la classe de service d’implémentation, nous utilisons Map pour stocker des objets Personne comme source de données. Dans la programmation du monde réel, nous aimerions les sauvegarder dans des tables de base de données.

package com.journaldev.jaxws.service;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.journaldev.jaxws.beans.Person;

public class PersonServiceImpl implements PersonService {

	private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
	
	@Override
	public boolean addPerson(Person p) {
		if(persons.get(p.getId()) != null) return false;
		persons.put(p.getId(), p);
		return true;
	}

	@Override
	public boolean deletePerson(int id) {
		if(persons.get(id) == null) return false;
		persons.remove(id);
		return true;
	}

	@Override
	public Person getPerson(int id) {
		return persons.get(id);
	}

	@Override
	public Person[] getAllPersons() {
		Set<Integer> ids = persons.keySet();
		Person[] p = new Person[ids.size()];
		int i=0;
		for(Integer id : ids){
			p[i] = persons.get(id);
			i++;
		}
		return p;
	}

}

C’est tout pour notre logique métier, puisque nous les utiliserons dans un service Web, il n’y a pas d’intérêt à créer des pages Web ici. Remarquez que nous n’avons aucune référence à des classes de services Web dans le code ci-dessus.

Services Web SOAP en Java utilisant Eclipse

Une fois que notre logique métier est prête, la prochaine étape consiste à utiliser Eclipse pour créer une application de service Web à partir de celle-ci. Créez un nouveau projet et sélectionnez l’assistant Service Web. Cliquez sur le bouton Suivant et vous arriverez sur une page où les détails du service Web et de son client doivent être fournis. C’est la page la plus importante dans la création de service Web. Assurez-vous de sélectionner « Type de service Web » comme « Service Web de type Java bean par le bas » car nous mettons en œuvre une approche par le bas. Il existe deux façons de créer un service Web :

  1. dernière version de contrat ou approche par le bas : Dans cette approche, nous créons d’abord l’implémentation, puis nous générons le fichier WSDL à partir de celle-ci. Notre implémentation correspond à cette catégorie.
  2. Première version de contrat ou approche par le haut : Dans cette approche, nous créons d’abord le contrat du service Web, c’est-à-dire le fichier WSDL, puis nous créons l’implémentation pour celui-ci.

Dans l’implémentation du service, fournissez le chemin d’accès entièrement classifié de la classe d’implémentation PersonServiceImpl. Assurez-vous de déplacer le curseur du type de service et du client vers le côté gauche afin qu’il puisse générer le programme client et également l’interface utilisateur pour tester notre service web. Vérifiez les configurations dans l’implémentation du service web, vous devez fournir les détails corrects pour le runtime du serveur, le runtime du service web et le projet de service. Habituellement, ils sont automatiquement renseignés et vous n’avez pas besoin d’apporter de modifications ici. Pour les configurations client, vous pouvez fournir le nom du projet client comme vous le souhaitez. Je l’ai laissé par défaut en tant que SOAPExampleClient. Si vous cliquez sur le lien pour le runtime du service web, vous obtiendrez différentes options comme indiqué dans l’image ci-dessous. Cependant, je l’ai laissé comme celui par défaut. Cliquez sur le bouton Suivant, puis vous pourrez choisir les méthodes que vous souhaitez exposer en tant que service web. Vous pourrez également choisir le style de service web comme document ou littéral. Vous pouvez changer le nom du document WSDL, mais il est bon de le conserver avec le nom de la classe d’implémentation pour éviter toute confusion ultérieure. Cliquez sur le bouton Suivant et vous obtiendrez la page de démarrage du serveur, cliquez sur le bouton « Démarrer le serveur » et ensuite le bouton Suivant sera activé. Cliquez sur le bouton Suivant et vous obtiendrez une page pour lancer l’explorateur de services web. Cliquez sur le bouton Lancer et cela ouvrira une nouvelle fenêtre dans le navigateur où vous pouvez tester votre service web avant de passer à la partie application client. Il ressemble à l’image ci-dessous pour notre projet. Nous pouvons effectuer quelques tests de validation ici, mais pour notre application simple, je suis prêt à passer à la création de l’application client. Cliquez sur le bouton Suivant dans la fenêtre contextuelle des services web Eclipse et vous obtiendrez une page pour le dossier source de l’application client. Cliquez sur le bouton Suivant et vous obtiendrez différentes options à choisir comme installation de test. Je vais de l’avant avec JAX-RPC JSPs afin que l’application client génère une page JSP que nous pouvons utiliser. Remarquez les méthodes getEndpoint() et setEndpoint(String) ajoutées que nous pouvons utiliser pour obtenir l’URL de point de terminaison du service web et nous pouvons le définir sur une autre URL au cas où nous déplacerions notre serveur vers une autre URL de point de terminaison. Cliquez sur le bouton Terminer et Eclipse créera le projet client dans votre espace de travail, il lancera également la page de test client JSP comme indiqué ci-dessous. Vous pouvez copier l’URL et l’ouvrir dans n’importe quel navigateur que vous préférez. Testons quelques-uns des services que nous avons exposés et voyons la sortie.

Test de service Web SOAP Eclipse

  • addPersonne

  • getPersonne

  • getAllPersons Notez que les détails de la personne ne sont pas imprimés dans la section des résultats, car il s’agit de code généré automatiquement et nous devons le refactoriser un peu pour obtenir la sortie souhaitée. Ouvrez Result.jsp dans le projet client et vous verrez qu’il utilise une structure switch pour générer la sortie du résultat. Pour la méthode getAllPersons(), c’était le cas 42 dans mon cas. Notez que cela pourrait être totalement différent dans votre cas. J’ai juste modifié le code pour le cas 42 comme indiqué ci-dessous.

    case 42:
            gotMethod = true;
            com.journaldev.jaxws.beans.Person[] getAllPersons42mtemp = samplePersonServiceImplProxyid.getAllPersons();
    if(getAllPersons42mtemp == null){
    %>
    <%=getAllPersons42mtemp %>
    <%
    }else{
            String tempreturnp43 = null;
            if(getAllPersons42mtemp != null){
            java.util.List<com.journaldev.jaxws.beans.Person> listreturnp43= java.util.Arrays.asList(getAllPersons42mtemp);
            //tempreturnp43 = listreturnp43.toString();
            for(com.journaldev.jaxws.beans.Person p : listreturnp43){
            	int id = p.getId();
            	int age = p.getAge();
            	String name=p.getName();
            	%>
            	<%=id%>::<%=name %>::<%=age %>
            	<%
            	}
            }
            }      
    break;
    

    Après cela, nous obtenons la sortie ci-dessous, notez que Eclipse effectue un déploiement à chaud ici, donc je n’ai pas eu à redéployer mon application.

Il semble que nos services web et applications clientes fonctionnent correctement, prenez le temps d’examiner les stubs côté client générés par Eclipse pour en savoir plus.

WSDL et configurations du service web SOAP

Enfin, vous remarquerez que le fichier WSDL est généré dans le projet de service web comme indiqué ci-dessous. Code PersonServiceImpl.wsdl :

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="https://service.jaxws.journaldev.com" xmlns:apachesoap="https://xml.apache.org/xml-soap" xmlns:impl="https://service.jaxws.journaldev.com" xmlns:intf="https://service.jaxws.journaldev.com" xmlns:tns1="https://beans.jaxws.journaldev.com" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="https://service.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
   <import namespace="https://beans.jaxws.journaldev.com"/>
   <element name="addPerson">
    <complexType>
     <sequence>
      <element name="p" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
   <element name="addPersonResponse">
    <complexType>
     <sequence>
      <element name="addPersonReturn" type="xsd:boolean"/>
     </sequence>
    </complexType>
   </element>
   <element name="deletePerson">
    <complexType>
     <sequence>
      <element name="id" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="deletePersonResponse">
    <complexType>
     <sequence>
      <element name="deletePersonReturn" type="xsd:boolean"/>
     </sequence>
    </complexType>
   </element>
   <element name="getPerson">
    <complexType>
     <sequence>
      <element name="id" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="getPersonResponse">
    <complexType>
     <sequence>
      <element name="getPersonReturn" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
   <element name="getAllPersons">
    <complexType/>
   </element>
   <element name="getAllPersonsResponse">
    <complexType>
     <sequence>
      <element maxOccurs="unbounded" name="getAllPersonsReturn" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
  </schema>
  <schema elementFormDefault="qualified" targetNamespace="https://beans.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
   <complexType name="Person">
    <sequence>
     <element name="age" type="xsd:int"/>
     <element name="id" type="xsd:int"/>
     <element name="name" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="addPersonResponse">

      <wsdl:part element="impl:addPersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getAllPersonsResponse">

      <wsdl:part element="impl:getAllPersonsResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="deletePersonResponse">

      <wsdl:part element="impl:deletePersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="addPersonRequest">

      <wsdl:part element="impl:addPerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getPersonResponse">

      <wsdl:part element="impl:getPersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getPersonRequest">

      <wsdl:part element="impl:getPerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="deletePersonRequest">

      <wsdl:part element="impl:deletePerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getAllPersonsRequest">

      <wsdl:part element="impl:getAllPersons" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:portType name="PersonServiceImpl">

      <wsdl:operation name="addPerson">

         <wsdl:input message="impl:addPersonRequest" name="addPersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:addPersonResponse" name="addPersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="deletePerson">

         <wsdl:input message="impl:deletePersonRequest" name="deletePersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:deletePersonResponse" name="deletePersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getPerson">

         <wsdl:input message="impl:getPersonRequest" name="getPersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:getPersonResponse" name="getPersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getAllPersons">

         <wsdl:input message="impl:getAllPersonsRequest" name="getAllPersonsRequest">

       </wsdl:input>

         <wsdl:output message="impl:getAllPersonsResponse" name="getAllPersonsResponse">

       </wsdl:output>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="PersonServiceImplSoapBinding" type="impl:PersonServiceImpl">

      <wsdlsoap:binding style="document" transport="https://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="addPerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="addPersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="addPersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="deletePerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="deletePersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="deletePersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getPerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getPersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getPersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getAllPersons">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getAllPersonsRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getAllPersonsResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="PersonServiceImplService">

      <wsdl:port binding="impl:PersonServiceImplSoapBinding" name="PersonServiceImpl">

         <wsdlsoap:address location="https://localhost:8080/SOAPExample/services/PersonServiceImpl"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>

Si vous l’ouvrez en mode conception dans Eclipse, cela ressemblera à l’image ci-dessous. Vous pouvez également accéder au fichier WSDL du service Web via le navigateur en ajoutant ?wsdl à l’extrémité du service Web. Vous remarquerez également que web.xml est modifié pour utiliser Apache Axis comme contrôleur frontal pour le service Web.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SOAPExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-name>AxisServlet</servlet-name>
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <servlet>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-name>AdminServlet</servlet-name>
    <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
    <load-on-startup>100</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/servlet/AdminServlet</url-pattern>
  </servlet-mapping>
</web-app>

L’image ci-dessous montre le service Web et le projet client avec tous les stubs générés automatiquement et les pages JSP pour tester le service Web. Voilà pour les services Web SOAP en exemple Java en utilisant Eclipse, comme vous pouvez le constater, toute la partie difficile a été automatiquement réalisée par Eclipse et tout notre focus était d’écrire la logique métier pour notre service Web.

Source:
https://www.digitalocean.com/community/tutorials/soap-webservices-in-java-example-eclipse