Apache CXF avec POJO

Dans ce chapitre, vous apprendrez à développer une application Web simple qui envoie un message d'accueil à l'utilisateur. Un projet de service Web utilise le modèle WSDL . Le CXF vous permet de masquer ce modèle WSDL en fournissant une interface simple pour mapper les API Apache CXF au WSDL sous-jacent.

Dans ce projet le plus simple, l'interface du service Web sera directement exposée au client et le client utilisera les API Apache CXF natives pour appeler le service Web.

Tout d'abord, nous allons créer un service Web. Chaque service a une interface qui est exposée au client. Nous pouvons écrire cette interface comme une simple interface Apache CXF ou comme un document WSDL. Dans cette approche Apache CXF-First, nous exposerons notre service via une interface Apache CXF.

Développement d'un service Web

Le service que nous allons créer sur le Web aura une seule méthode Web appelée greetings. La méthode prend unstringargument de type dans lequel nous enverrons le nom de l'utilisateur. Le service renverra un message d'accueil à l'appelant avec le nom d'utilisateur reçu inclus dans le message.

Interface de service Web

Pour exposer l'interface de notre service Web, nous allons créer une interface Apache CXF comme suit -

//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
   String greetings(String text);
}

L'interface n'a qu'une seule méthode appelée greetings. Le serveur implémentera cette interface. Dans notre application triviale, cette interface est directement exposée au client. En règle générale, dans une application de service Web, vous utilisez WSDL pour décrire l'interface de service Web. Dans cette application simple, nous fournirons cette interface directe au développeur client. Le client appellerait alors legreetingsmessage sur l'objet serveur. Alors commençons par créer le service Web.

Implémentation de service Web

le HelloWorld l'interface est implémentée dans le HelloWorldImpl Classe Apache CXF comme indiqué ci-dessous -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String text) {
      return "Hi " + text;
   }
}

le greetings la méthode reçoit un paramètre de string type, l'ajoute à un message d'accueil et renvoie la chaîne résultante à l'appelant.

Ensuite, nous écrivons l'application serveur pour héberger le HelloWorld un service.

Création du serveur

L'application serveur se compose de deux parties -

  • La première partie crée une usine pour notre service Web, et

  • La deuxième partie écrit un main méthode pour l'instancier.

Le serveur utilise ServerFactoryBean classe fournie par les bibliothèques CXF pour exposer notre HelloWorldinterface avec les clients distants. Ainsi, nous instancions d'abord leServerFactoryBean class, puis définissez ses différentes propriétés -

ServerFactoryBean factory = new ServerFactoryBean();

Nous définissons la classe de service à appeler en appelant le setServiceClass méthode sur le factory objet -

factory.setServiceClass(HelloWorld.class);

Nous définissons l'URL pour appeler notre service en appelant l'usine setAddressméthode. Notez que le service sera publié à cette URL.

factory.setAddress("http://localhost:5000/Hello");

Dans ce cas, le service est déployé sur le serveur intégré et écoutera le port 5000. Vous pouvez opter pour n'importe quel numéro de port de votre choix.

Avant de créer l'usine, vous devez informer l'usine de notre classe d'implémentation de service. Cela se fait en appelant lesetServiceBean méthode sur le factory objet comme montré ici -

factory.setServiceBean(new HelloWorldImpl());

Le bean de service est défini sur l'instance de notre classe d'implémentation de service. Enfin, nous créons l'usine en appelant soncreate méthode -

factory.create();

Maintenant que nous avons développé l'usine pour exécuter notre service Web, nous écrirons ensuite un main méthode pour l'instancier et le maintenir pendant un certain temps.

Maintenant, écrivez un main méthode pour instancier la HelloServer classe comme suit -

public static void main(String[] args) throws Exception {
   new HelloServer();
   System.out.println("Listening on port 5000 ...");
}

Une fois instancié, le HelloServerclass continuera à fonctionner indéfiniment. Pour les déploiements de production, vous garderez certainement votre serveur en marche pour toujours. Dans la situation actuelle, nous terminerions le serveur après un temps prédéterminé comme suit -

Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);

L'ensemble du code pour le HelloServer la classe est donnée ci-dessous -

//HelloServer.java
//HelloServer.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ServerFactoryBean;
public class HelloServer {
   protected HelloServer() throws Exception {
      ServerFactoryBean factory = new ServerFactoryBean();
      factory.setServiceClass(HelloWorld.class);
      factory.setAddress("http://localhost:5000/Hello");
      factory.setServiceBean(new HelloWorldImpl());
      factory.create();
   }
   public static void main(String[] args) throws Exception {
      new HelloServer();
      System.out.println("Listening on port 5000 ...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

L'application serveur que nous avons créée utilise ServerFactoryBeanclasse des bibliothèques CXF. Nous devons maintenant inclure ces bibliothèques dans notre projet pour réussir à compiler leHelloServerclasse. Nous utiliseronsMaven pour configurer les dépendances du projet.

Configurer le projet Maven

Pour créer un projet Maven, tapez la commande suivante dans votre fenêtre de ligne de commande. Notez que nous avons testé cela sur une machine Mac. Pour les installations Windows et Linux, les instructions peuvent différer à certains endroits.

mvn archetype:generate

Lorsqu'on vous demande les propriétés, saisissez les valeurs suivantes -

Define value for property 'groupId': : com.tutorialspoint
Define value for property 'artifactId': : cxf-pojo
Define value for property 'version': 1.0-SNAPSHOT: : 1.0
Define value for property 'package': com.tutorialspoint: : com.tutorialspoint.cxf.pojo

À la fin de la commande maven, vous trouverez la structure de dossier appropriée créée dans votre dossier actuel avec le fichier pom.xml.

La structure de répertoire générée est affichée ici -

Vous allez ajouter les dépendances CXF dans le pom.xmlet copiez également les fichiers Apache CXF créés ci-dessus dans le dossier approprié de la structure créée par maven. Pour votre référence, nous avons donné ci-dessous le fichier pom.xml du projet que nous avons créé sur notre machine.

<?xml version = "1.0" encoding = "UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>cxf-pojo</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   
   <profiles>
      <profile>
         <id>server</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.cxf.pojo.HelloServer
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
      
      <profile>
         <id>client</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                           com.tutorialspoint.cxf.pojo.HelloClient
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-simple</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </dependency>
      <!-- Jetty is needed if you're using the CXFServlet -->
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
</project>

Le pom.xml ci-dessus peut inclure des dépendances supplémentaires qui ne sont pas pertinentes pour ce projet, mais qui sont nécessaires pour notre prochain projet dans ce didacticiel. Quoi qu'il en soit, il n'y a aucun mal en tant que tel à inclure des dépendances supplémentaires.

Structure des dossiers du projet

La structure du dossier du projet sur ma machine après avoir placé les fichiers serveur et client Apache CXF est indiquée ci-dessous pour votre référence rapide -

Serveur en cours d'exécution

Pour créer le projet, utilisez la commande suivante dans votre fenêtre de ligne de commande -

mvn clean install

Vous pouvez démarrer le serveur à l'aide de la commande suivante -

mvn -Pserver

Cela démarrera le serveur et vous verrez l'invite suivante sur la console -

INFO: Creating Service {http://pojo.cxf.tutorialspoint.com/}HelloWorld from class com.tutorialspoint.cxf.pojo.HelloWorld
INFO: Setting the server's publish address to be http://localhost:5000/Hello
Listening on port 5000 ...

Maintenant, dans la fenêtre de votre navigateur, spécifiez l'URL de notre service publié. Vous verrez la sortie suivante -

Cela confirme que notre service s'exécute sur le port spécifié sur un hôte local. Puisque nous n'avons pas spécifié legreetings message dans notre appel, un message d'erreur SOAP est renvoyé au navigateur.

Vous pouvez tester davantage votre service Web à l'aide d'un client SOAP de votre choix. Ici, nous avons utilisé Postman pour tester notre serveur.

La sortie est comme indiqué ici -

Observe ceci SOAP Requestétait codé à la main. Après avoir publié la demande, le serveur a envoyé unSOAP Response message, qui est visible dans la partie inférieure de la capture d'écran.

À partir de là, vous pouvez comprendre que CXF maintient l'utilisation des protocoles SOAP pour les demandes et les réponses tout en vous offrant une vue unifiée de diverses technologies Web qui existent dans le monde d'aujourd'hui. Cela simplifie grandement le développement d'applications Web.

Notre prochaine tâche est de créer un client qui consommera le service Web que vous avez créé.

Création du client

Dans l'application serveur HelloWorldest l'interface qui expose notre service Web. Le service Web lui-même fournit simplement un message de bienvenue au client. En général, l'interface du service Web est exposée au monde extérieur à l'aide de WSDL (Web Services Description Language). Dans cette application triviale, nous exposerons notre service Web au client en exposant directement l'interface de service et c'est leHelloWorld.class.

À cette fin, CXF fournit une classe d'usine appelée ClientProxyFactoryBean cela nous permet de nous attacher à l'interface souhaitée à l'instance d'usine créée.

Tout d'abord, nous créons une instance de bean d'usine comme suit -

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

Nous appelons le setAddresssur l'instance du bean usine pour définir l'URL par laquelle notre service Web peut être appelé. Dans notre cas, nous utiliserons l'URL utilisée lors de la création du serveur lors de notre étape précédente -

factory.setAddress("http://localhost:5000/Hello");

Ensuite, nous appelons le create méthode sur le factory instance pour attacher notre interface de service HelloWorld.class à lui.

HelloWorld helloServer = factory.create(HelloWorld.class);

Enfin, nous appelons le greetings méthode pour appeler le service Web distant.

System.out.println(helloServer.greetings(System.getProperty("user.name")));

Cela imprimerait un message d'accueil sur votre console.

La source complète de l'application cliente est indiquée ci-dessous -

//HelloClient.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
public class HelloClient {
   public static void main(String[] args) throws Exception {
      ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
      factory.setAddress("http://localhost:5000/Hello");
      HelloWorld helloServer = factory.create(HelloWorld.class);
      System.out.println(helloServer.greetings(System.getProperty("user.name")));
   }
}

Client en cours d'exécution

Assurez-vous que le serveur est toujours en cours d'exécution sur votre machine. Au cas où, s'il a expiré, redémarrez le serveur avec la commande suivante -

mvn -Pserver

Vous verrez le message suivant sur la console -

Listening on port 5000 ...

Maintenant, avant que le serveur n'expire, ce que nous avons défini sur 5 minutes, ouvrez une autre fenêtre de ligne de commande et démarrez le client avec la commande suivante -

mvn -Pclient

Vous verrez un message similaire au suivant sur la ligne de commande -

Hi tutorialspoint

Notez que tutorialspointest notre nom d'utilisateur. Vous recevrez une salutation avec votre propre nom.

Dans le chapitre suivant, nous apprendrons à utiliser CXF dans un projet JAX-WS (Apache CXF API for XML Web Services).