Projets
Pages enfant
  • 3.11.3 Accéder au service exposé

Vous regardez une version antérieure (v. /wiki/spaces/PROJ/pages/100663572/3.11.3+Acc%C3%A9der+au+service+expos%C3%A9) de cette page.

afficher les différences afficher l'historique de la page

« Afficher la version précédente Vous regardez la version actuelle de cette page. (v. 3) afficher la version suivante »

Introduction

La méthode qui est présentée ici consiste à :

  • Générer automatiquement du code java d'accès au service distant via maven (Ici on utilise, à titre d'exemple, un service de création d'entrée dans le WorkFlow de ORI-OAI cf. ori-oai.org )
  • Utiliser ce code java dans la couche métier de l'application

Au final on accède au service avec très peu de code. Tout le travaille est fait par le plugin CFX pour maven qui va complétement masquer la complexité du code JAX-WS en le générant automatiquement.

Le pom.xml

Le plugin

Pour que le plugin CFX pour maven génère automatiquement le code il faut ajouter ces lignes dans les pom.xml :

<plugin>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-codegen-plugin</artifactId>
 <executions>
  <execution>
   <id>generate-sources</id>
   <phase>generate-sources</phase>
   <configuration>
    <wsdlOptions>
     <wsdlOption>
      <wsdl>http://srv.univ.fr/workflow/xfire/OriWorkflowService?wsdl</wsdl>
     </wsdlOption>
    </wsdlOptions>
   </configuration>
   <goals>
    <goal>wsdl2java</goal>
   </goals>
  </execution>
 </executions>
</plugin>

configuration/wsdlOptions/wsdlOption/wsdl est le WSDL qui va être utilisé par la génération du code.

Ce WSDL sera redéfini, par la configuration de l'application, lors de l'excursion. En effet, on ne peut pas préjuger, lors de l'écriture du code, de la localisation du Web Service à utiliser.

Le code sera automatiquement généré lors d'appels maven classiques comme mvn compile ou autres. Il sera aussi automatiquement ajouté au classpath eclipse via la commande mvn eclipse:eclipse

Les dépendances

Pour pouvoir utiliser CXF dans un développement le plus simple est d'ajouter la dépendance suivante :

<dependency>
 <groupId>org.esupportail</groupId>
 <artifactId>esup-commons2-ws-cxf</artifactId>
 <version>${esup-commons.version}</version>
 <type>pom</type>
</dependency>

Le fait d'utiliser cette dépendance esup-commons permet de rationaliser les différents développements en garantissant que tous les développements utilisent, pour une même version des esup-commons donnée, les mêmes librairies

Avec la version 0.2 de esup-commons j'ai constaté qu'il fallait aussi préciser d'utiliser cette dépense explicitement dans le pom.xml de l'application :

<dependency>
 <groupId>xerces</groupId>
 <artifactId>xercesImpl</artifactId>
 <version>2.8.1</version>
</dependency>

Cette dépendance sera ajoutée dans futures versions de esup-commons2-ws-cxf afin d'éviter au développeur de s'en préoccuper et de perdre du temps à comprendre pourquoi son développement ne fonctionne.

Le code métier

Je prends ici l'exemple d'un appel au Web Service du moteur de WorkFlow de ORI-OAI.

public Long createWorkflowInstance(String XML, String uid) {
 IOriWorkflowService oriWorkflowService;
 try {
  oriWorkflowService = new IOriWorkflowService(new URL(wsdl));
 }
 catch (MalformedURLException e) {
  throw new RuntimeException(e);
 }
 IOriWorkflowServicePortType client = oriWorkflowService.getIOriWorkflowServiceHttpPort();
 return client.newWorkflowInstance(XML, metadataTypeId, uid);
}

IoriWorkflowService est un objet automatiquement généré par le plugin CXF pour maven.

Il est ensuite instancié en prenant en paramètre l'URL du WSDL du Web Service à utiliser. Typiquement ici, il s'agit d'un attribut de la classe domainServiceImpl qui est injecté par Spring et correspond à un paramétrage de l'exploitant de l'application.

Ensuite je crée un objet de type IoriWorkflowServicePortType (lui aussi généré automatiquement) qui est le point d'entré vers les méthodes exposées par le Web Service.

Ensuite j'ai directement accès aux méthodes métier du WorkFlow ORI comme newWorkflowInstance.

Testons

La aussi c'est simple !

Dans src/test/java j'ajoute une classe de test :

@ContextConfiguration(locations="/properties/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class oriWorkflowWsTest {
.../...

Les annotations me permettent d'automatiquement charger le context Spring.

J'injecte le domainService par annotation :

@Autowired
DomainService domainService;

Le code de test :

@Test
public void testOriWorkflowWs() {
 InputStream inputStream = getClass().getResourceAsStream("/tef-simple-auteur-test.xml");
 String XML = getString(inputStream);
 domainService.createWorkflowInstance(XML, "bourges");
}

tef-simple-auteur-test.xml est un fichier XML d'exemple présent dans src/test/resources du projet

  • Aucune étiquette