Dorian LAMANDE & Technologies Microsoft

Silverlight et consommation de Web Service Java (SOAP).

Publié par Dorian LAMANDE le juin 22, 2009

Un petit peu d’interopérabilité de temps en temps cela ne fait pas de mal !

Ce post va vous montrer comment utiliser un Web Service Java avec Silverlight et tant qu’à faire utilisons SL 3 !

Je reprends pas mal d’éléments de ce post là :

http://blogs.msdn.com/silverlight_plus_java/archive/2008/08/04/how-to-silverlight-accessing-java-soap-services-part-1-cross-domain-iis-tomcat.aspx

Stève Sfartz et Ronny Kwon ont réalisé un très bel article.

Il y’a donc quelques pré-requis :

    • Eclipse : j’ai pris la version eclipse-jee-ganymede-SR2-win32
    • Tom Cat : j’ai choisi apache-tomcat-5.5.27
    • Et Visual Studio & Cie. Mais on pouvait s’en douter !

1. Installation Eclipse

Décompressons eclipse-jee-ganymede-SR2-win32.zip et copions le répertoire “eclipse” dans c:\.

Exécutons “eclipse.exe”, afin de vérifier que vous avons les pré-requis pour Eclispe (JVM par exemple).

2. Installation Tom Cat

Exécutons apache-tomcat-5.5.27.exe

Démarrons-le et testons l’adresse http://localhost:8080/

3. Installation de Metro

Ouvrons une console, et entrons la commande suivante :

“java –jar metro-1_2.jar”

4. Création du Service Web Java (SOAP) sous Eclipse

Créons un nouveau projet :
“New > Dynamic Web Project”. Nommer-le “SOAP-SumService”.

Si nous avons bien installer “Metro”, nous trouverons des fichiers JAR dans:
$path\metro\lib ($path étant votre dossier d’installation, i.e c:\).

Copions tous les .jar dans le projet SOAP-SumService, dans le dossier WebContent\WEB-INF\lib. Ces fichiers sont nécessaires au déploiement et à l’exécution du Web Service.

Créons un nouveau package, que vous nommerez “service” et ajoutons une nouvelle classe JAVA : “ServiceSumImpl”. C’est dans cette classe que nous allons implémenter notre service.

Enfin ajoutons un fichier XML dans le dossier “WebContent\WEB-INF : “sun-jaxws.xml”.

La structure du projet doit-être comme ceci :

                      Archi_Java

5. Implémentation du Service Web.

Tout d’abord, il faut importer les librairies nécessaires à la construction du Web Service. Modifions donc le fichier “ServiceSumImpl” comme ceci :

 

image

Ensuite, nous devons déclarer le Web Service.

 

 

image

Maintenant exposons notre méthode getSum. Cette méthode retournera la sum de deux entiers. Notons ici que la méthode exposée s’appelle getSum mais que nous pouvons très la publier sous un autre nom, par exemple : SumTwoInt.

 

image

Notre code source est maintenant près, il nous reste plus qu’à compiler et à héberger le service.

6. Compilation de Web Service

C’est ici que “Metro” va nous servir. En effet, il va fournir “wsgen”  (https://metro.dev.java.net/1.2/docs/wsgen.html)

Ouvrons une console et entrons la commande suivante :

C:\>set METRO=”C:\metro\bin\”

Maintenant, buildons la solution, toujours avec notre console. (Ici, il faut se placer dans la dossier de votre projet).

Par exemple pour moi :
D:\EPSI\Stage_CSII2\Mpoware\SL3andSOAP\SOAP-SumService\build\classes

Entrons la commande suivante :

%METRO%\wsgen –cp . service.ServiceImpl –s ../../src

Ici vous pouvez faire face à une erreur.

D:\EPSI\Stage_CSII2\Mpoware\SL3andSOAP\SOAPSumService\build\classes>set METRO=”
C:\metro\bin”

D:\EPSI\Stage_CSII2\Mpoware\SL3andSOAP\SOAP-SumService\build\classes>%METRO%\wsg
en -cp .service.ServiceSumImpl -s ../../src
JDK’s tools.jar was not found in C:\Program Files\Java\lib\tools.jar. Usually th
is means you are running JRE, not JDK. Please use the java command in JDK 5.0 or
later (not JRE.)

J’utilise le jdk1.6.0_14, le fichier “tools.jar” se trouve dans “C:\Program Files\Java\jdk1.6.0_14\lib”. Copions ce fichier dans “C:\Program Files\Java\lib”. Le problème est résolu.

Voyons ce que cela à générer dans “Eclipse”.

Un nouveau package doit apparaître.

image

7. Déploiement du service

Nous devons ajouter un “Servlet” dans notre page web.xml. Le mapper et ajouter un listener. Comme Stève et Ronny nous allons prendre ce qui existe.

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns=http://java.sun.com/xml/ns/j2ee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    SOAP-SumService</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>
        <servlet-name>jaxservlet</servlet-name>
        <servlet-class>
        com.sun.xml.ws.transport.http.servlet.WSServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxservlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>
        com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
</web-app>

Il nous reste plus qu’à éditer le fichier sun-jaxws.xml afin d’y ajouter notre endpoint.

 

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    <endpoint
        name="sum"
        implementation="service.ServiceSumImpl"
        url-pattern="/services/sum"/>
</endpoints>

A ce stade, sauvegardons bien tous nos fichiers.

Déployons maintenant notre WebService sur le serveur Tom Cat.

imageimage

Cliquons sur “Finish”.

image

Notre Web Service est bien hébergé sur Tom Cat. Vérifions tout de suite si nous y accédons avec IE.

http://localhost:8080/SOAP-SumService/services/sum?wsdl

image

Ca fonctionne !

8. Attaque du Service SOAP avec Silverlight.

Créons un nouveau projet Silverlight avec Visual Studio 2008.

image

Ici j’ai repris le même design que Ronny et Stève. Editons le MainPage.xaml.

<UserControl x:Class="SOAP_Sum.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
        <Canvas x:Name="LayoutRoot" Background="White">
            <TextBox Text="0" x:Name="_int1" Width="50" Height="20" Canvas.Top="10" Canvas.Left="30" TextChanged="_TextChanged"/>
            <TextBlock Canvas.Top="10" Canvas.Left="95" Text="+"/>
            <TextBox Text="0" x:Name="_int2" Width="50" Height="20" Canvas.Top="10" Canvas.Left="120" TextChanged="_TextChanged"/>
            <TextBlock Canvas.Top="10" Canvas.Left="175" Text="="/>
            <TextBlock x:Name="_result" Canvas.Top="10" Canvas.Left="190" Text=""/>
        </Canvas>
</UserControl>

 

Avant d’aller modifier le .cs de notre page, ajoutons la référence au Web Service. (Click droit sur “References>Add Service Reference”).

image

Comme tout service (WCF ou SOAP) il faut implémenter le proxy. Modifions alors notre fichier MainPage.xaml.cs.

Ajoutons la référence au Service :

using SOAP_Sum.ServiceSum;

Nous devons instancier le proxy.

ServiceSumClient client = new ServiceSumClient();

Avec Silverlight il faut utiliser un EventHandler afin de pouvoir récupérer notre résultat.

client.SumTwoIntCompleted += new EventHandler<SumTwoIntCompletedEventArgs>(client_SumTwoIntCompleted);

Nous devons utiliser une opération Async afin de pouvoir envoyé nos deux entiers. Voici ce que donne le code complet.

 

private void _TextChanged(object sender, TextChangedEventArgs e)
        {
            if (_int1.Text == "" || _int2.Text == "") return;

            int a = int.Parse(_int1.Text);
            int b = int.Parse(_int2.Text);
            ServiceSumClient client = new ServiceSumClient();
            client.SumTwoIntCompleted += new EventHandler<SumTwoIntCompletedEventArgs>(client_SumTwoIntCompleted);
            client.SumTwoIntAsync(a, b);
        }
void client_SumTwoIntCompleted(object sender, SumTwoIntCompletedEventArgs e)
        {
            _result.Text = e.Result.ToString();
        }

Compilons et exécutons le projet.

Surprise nous avons une erreur qui concerne le cross-domaine. Pas de panique je vais vous montrer comment la contourner !

image

Il faut en fait rajouter un fichier nommé “clientaccesspolicy.xml” dans le dossier host de votre WebService.

J’ai mis du temps à le trouver ce fameux dossier (merci Ronny). Celui-ci ne se trouve pas dans le répertoire d’installation de TomCat comme on pouvait le penser. Il se trouve ici :

<votre_workspace>\.metadata\.plugins\org.eclipse.wst.server.core\

tmp0\wtpwebapps\ROOT

Plaçons-nous donc dans ce dossier et ajoutons-y le fichier “clientaccesspolicy.xml” :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                <allow-from http-request-headers="*">
                    <domain uri="*"/>
                </allow-from>
                <grant-to>
                    <resource include-subpaths="true" path="/"/>
                </grant-to>
            </policy>
        </cross-domain-access>
    </access-policy>

 

Recompilons notre projet Silverlight, et … cette fois ci ca fonctionne !

Dorian LAMANDE.

Stagiaire Ingénieur chez Mpoware

Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Twitter picture

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Connexion à %s

 
Suivre

Get every new post delivered to your Inbox.