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

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

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 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 travail 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.

...

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

Bloc de code
xml
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>

...

Remarque

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 Eclipse via la commande mvn eclipse:eclipse

...

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

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

...

Remarque

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

Bloc de code
xml
xml
<dependency>
 <groupId>xerces</groupId>
 <artifactId>xercesImpl</artifactId>
 <version>2.8.1</version>
</dependency>

Cette dépendance sera ajoutée dans les 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 pas.

Le code métier

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

Bloc de code
java
java
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 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 , on crée un objet de type IoriWorkflowServicePortType IOriWorkflowServicePortType (lui aussi généré automatiquement) qui est le point d'entré entrée vers les méthodes exposées par le Web Service.

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

Testons...

La aussi c'est simple !

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

Bloc de code
java
java
@ContextConfiguration(locations="/properties/applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class oriWorkflowWsTestOriWorkflowWsTest {
.../...

Les annotations me permettent ici d'automatiquement charger le context Springcontexte Spring lors de l'exécution du test.

J'On injecte ensuite le domainService par annotation annotation :

Bloc de code
java
java
@Autowired
DomainService domainService;

Le Voici le code de test test :

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

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