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)

É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
webservice-definition-beans.xml
Ajoutez au fichier web.xml les éléments permettant de charger le conteneur spring.
Étape 3 : build maven
pom.xml
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
Ici, nous créons le client webservice CXF que nous allons invoquer lors de notre test sur la classe ClientServicesWeb.
ClientServicesWeb (Test)
‹?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 :
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.
Aucun commentaire:
Enregistrer un commentaire