Aujourd’hui je vous présente un exemple d’une application
web qui publie un Service Web simple à l'aide d’Apache CXF et Spring sur un
serveur léger (Tomcat) pour un test rapide.
Pour commencer ce test on a besoin des outils suivant :
- Maven 3
- Spring 3.1.1
- Apache CXF 2.6.0
- Tomcat 7
Voici l’architecture du projet :
Étape 1 : création du service web
AfficherHoraireService (Interface)
Afin de travailler avec les services Web, il faut utiliser des interfaces pour nos services ...
AfficherHoraireServiceImpl (Implémentation)
Le paramètre endpointInterface doit pointer vers l'interface que nous mettons en œuvre pour le service Web…
Étape 2 : intégration Spring / CXF
Parmis les avantages du framework CXF
est sa bonne intégration avec le framework Spring et que le code généré est beaucoup, beaucoup plus petit qu’avec les autres...
service-definition-beans.xml
‹?xml version="1.0" encoding="UTF-8"?›
‹beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"/›
‹bean id="afficherHoraireService"
class="com.saou.demo.services.AfficherHoraireServiceImpl" /›
‹/beans›
Ici, nous définissons un bean service normal (afficherHoraireService).
webservice-definition-beans.xml
‹?xml version="1.0" encoding="UTF-8"?›
‹beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"/›
‹import resource="classpath:service-definition-beans.xml" /›
‹jaxws:endpoint id="afficherHoraireWebService"
implementor="#afficherHoraireService"
address="/AfficherHoraire" /›
‹/beans›
Vous voudrez peut-être séparés les fichiers xml de définition des beans, plutôt il est important de les séparer par fonctionnalité (par exemple : les beans service, les beans webservice, les beans test...). En fait le bean afficherHoraireService défini dans le service-definition-beans.xml peut être déplacé ici au lieu d'importer cette ressource. Avec #afficherHoraireService nous faisons référence à un bean avec id="afficherHoraireService"...
Ajoutez au fichier web.xml les éléments permettant de charger le conteneur spring.
‹!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" ›
‹web-app›
‹context-param›
‹param-name›contextConfigLocation‹/param-name›
‹param-value›WEB-INF/webservice-definition-beans.xml‹/param-value›
‹/context-param›
‹listener›
‹listener-class›
org.springframework.web.context.ContextLoaderListener
‹/display-name›
‹/listener›
‹servlet›
‹servlet-name›CXFServlet‹/servlet-name›
‹display-name›CXF Servlet‹/display-name›
‹servlet-class›
org.apache.cxf.transport.servlet.CXFServlet
‹/servlet-class›
‹load-on-startup›1‹/load-on-startup›
‹/servlet›
‹servlet-mapping›
‹servlet-name›CXFServlet‹/servlet-name›
‹url-pattern›/*‹/url-pattern›
‹/servlet-mapping›
‹web-app›
C'est ici que nous configurons CXFServlet pour analyser tous notre demande sur les service Web.
Étape 3 : build maven
pom.xml
‹project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"/›
‹modelVersion›4.0.0‹/modelVersion›
‹groupId›com.saou.demo‹/groupId›
‹artifactId›spring-cxf-demo‹/artifactId›
‹packaging›war‹/packaging›
‹version›1.0-SNAPSHOT‹/version›
‹name›spring-cxf-demo Maven Webapp‹/name›
‹url›http://maven.apache.org‹/url›
‹dependencies›
‹!-- Spring dependencies --›
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›spring-web‹/artifactId›
‹version›3.1.1.RELEASE‹/version›
‹scope›compile‹/scope›
‹/dependency›
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›spring-context‹/artifactId›
‹version›3.1.1.RELEASE‹/version›
‹scope›compile‹/scope›
‹/dependency›
‹!-- Apache CXF for webservices --›
‹dependency›
‹groupId›org.apache.cxf‹/groupId›
‹artifactId›cxf-api‹/artifactId›
‹version›2.6.0‹/version›
‹scope›compile‹/scope›
‹/dependency›
‹dependency›
‹groupId›org.apache.cxf‹/groupId›
‹artifactId›cxf-rt-frontend-jaxws‹/artifactId›
‹version›2.6.0‹/version›
‹scope›compile‹/scope›
‹/dependency›
‹dependency›
‹groupId›org.apache.cxf‹/groupId›
‹artifactId›cxf-rt-transports-http‹/artifactId›
‹version›2.6.0‹/version›
‹scope›compile‹/scope›
‹/dependency›
‹!-- For testing purposes --›
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›spring-test‹/artifactId›
‹version›3.1.1.RELEASE‹/version›
‹scope›test‹/scope›
‹/dependency›
‹dependency›
‹groupId›junit‹/groupId›
‹artifactId›junit‹/artifactId›
‹version›4.8.2‹/version›
‹scope›test‹/scope›
‹/dependency›
‹dependencies›
‹build›
‹finalName›junit‹/finalName›
‹plugins›
‹!-- use JDK 1.6 --›
‹plugin›
‹groupId›org.apache.maven.plugins‹/groupId›
‹artifactId›maven-compiler-plugin‹/artifactId›
‹version›2.3.2‹/version›
‹configuration›
‹source›1.6‹/source›
‹target›1.6‹/target›
‹encoding›UTF-8‹/encoding›
‹/configuration›
‹/plugin›
‹plugins›
‹/build›
‹/project›
Maintenant il suffit de lancer la commande suivante :
mvn clean package
Après quelques secondes durant lesquels maven rapatrie en local les dépendences du projet, vous obtenez le résultat suivant :
Étape 4 : déploiement de l'application
Lancez tomcat et déposez la livraison (spring-cxf-demo.war) dans le répertoire
webapps de tomcat.
Aller sur le navigateur, et tapez à l’adresse suivant :
http://127.0.0.1:8080/spring-cxf-demo/
Voila CXF nous informe qu’un service web a été publié et est disponible
Étape 5 : Appel aux web services
client-definition-beans.xml
‹?xml version="1.0" encoding="UTF-8"?›
‹beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"/›
‹import resource="classpath:service-definition-beans.xml" /›
‹jaxws:endpoint id="afficherHoraireWebService"
serviceClass="com.saou.demo.services.AfficherHoraireService"
address="/AfficherHoraire" /›
‹/beans›
Ici, nous créons le client webservice CXF que nous allons invoquer lors de notre test sur la classe ClientServicesWeb.
ClientServicesWeb (Test)
Lancer la commande suivante :
mvn exec:java -Dexec.mainClass=com.saou.demo.client.ClientServicesWeb
Et voila, l'appel aux web services en mode console :
Conclusionde :
Il me faudra des raisons très convaincantes pour utiliser un autre framework car
:
- Le code généré est beaucoup, beaucoup plus petit avec CXF qu’avec les autres.
- Le code à écrire pour utiliser le framework est beaucoup plus simple et joli avec CXF.
- CXF est plus long à s’initialiser, mais va plus vite après.