Pour rappel, au niveau de l'architecture, un conteneur d'application va héberger notre service et son implémentation est assurée par un EJB sans etat (stateless).
En ce qui concerne les pré-requis, vous devez vous assurer de disposer de:
- Le JDK dans sa version 1.5
- JBoss IDE 2 beta 2 (bon jamais la version stable??) disponible en bundle ici
- JBoss AS 4.2.0GA en téléchargement ici
- Ouvrir la perspective JBoss AS
- Dans la vue "JBoss Server" : clic droit -> New server
- Sélectionner JBoss Inc/JBoss AS 4.0:
- Donner l'emplacement du serveur et sélectionner la configuration (default sera très bien pour notre tuto):
- Dans la vue "JBoss Server" : clic droit sur le serveur créé et le lancer en debug, la sortie sur la console ne doit normalement pas contenir d'erreur et finir par:
Sélectionner ensuite la configuration de serveur que nou avons précédemment défini (default).
A la création du projet, nous rencontron l'erreur (de jeunesse?) suivante:
Severity and Description Path Resource Location Creation Time Id
Project TestWS is missing required library: 'E:\j2ee\jboss-4.2.0.GA\server\default\deploy\ejb3.deployer\jboss-ejb3x.jar' TestWS Build path 1180700028078 24
Ce qui signifie que le buildpath est configuré pour trouver le fichier jboss-ejb3x.jar dans un répertoire alors qu'il ne s'y trouve pas... Pas de panique, vous pouvez trouver le fuyard dans le répertoire $JBOSS_HOME/server/default/lib. Une fois le jar manquant copié dans le répertoire attendu, demander à Eclipse de rafraîchir le contenu du projet pour que la présence du fichier soit détectée et l'erreur disparaît.
- Afin que les bibliothèques nécessaires à la création de services web JBoss soient chargées, par un clic droit sur la racine du projet, faire apparaître le menu contextuel et cliquer sur JBossWS/Add JBossWS nature. Une boîte de dialogue apparaît, les options par défaut conviennent à notre exemple:
- Créons maintenant une classe de base Hello dans le package org.tbt.wstuto:
public class Hello {
}
- Maintenant, nous allons un peu l'agrémenter en utilisant les annotations et en ajoutant une méthode pour notre service:
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
@Stateless // C'est un EJB sans état
@WebService // C'est un service Web
public class Hello {
@WebMethod
public int world(@WebParam(name="param")int iParam){
// Ca c'est spéciale dédicace pour VLT!
System.out.println("Goodbye cruel world...");
return 0;
}
}
- Nous allons maintenant configurer l'IDE pour créer notre jar gràce a la packaging configuration définie comme suit:
- Demander de créer le package par la commande Project/Run packaging configuration et le jar apparaît dans l'arborescence de votre projet.
- Reste maintenant à déployer votre service sur le conteneur: en perspective JBoss AS, faire glisser le jar sur notre serveur default dans la vue JBoss server afin de le faire apparaître dans les modules. Pour finir demander la publication du jar:
14:48:40,640 INFO [TomcatDeployer] deploy, ctxPath=/HelloService, warUrl=.../tmp/deploy/TestWS.jar-ws46100.war/
14:48:41,109 INFO [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
14:48:41,140 INFO [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=TestWS.jar,name=Hello,service=EJB3 with dependencies:
14:48:41,625 INFO [EJBContainer] STARTED EJB: org.tbt.wstuto.Hello ejbName: Hello
14:48:41,671 INFO [EJB3Deployer] Deployed: file:/E:/j2ee/jboss-4.2.0.GA/server/default/deploy/TestWS.jar
14:48:41,703 INFO [WSDLFilePublisher] WSDL published to: file:/E:/j2ee/jboss-4.2.0.GA/server/default/data/wsdl/TestWS.jar/HelloService46098.wsdl
14:48:41,781 INFO [ServiceEndpointManager] WebService started: http://localhost:8080/HelloService/Hello
Nous pouvons vérifier la présence de votre service gràce à JBoss WS http://localhost:8080/jbossws/services :
Conclusion
C'est une bonne illustration de l'apport des annotations: nous économisons ici l'écriture d'un fichier WSDL, voire d'un fichier de déploiement WSDD. Il n'est nullement besoin non plus d'empaqueter sous forme de war, donc pas non plus de web.xml!
Trop facile...
A noter néanmoins qu'il semble que le format de l'URL du service soit figée à http://hostname/