Apache CXF avec JAX-WS

Dans cette application JAX-WS, nous utiliserons l'approche Apache CXF-first comme la précédente application POJO. Nous allons donc d'abord créer une interface pour notre service Web.

Déclaration de l'interface de service

Comme dans le cas précédent, nous allons créer un service trivial qui n'a qu'une seule méthode d'interface appelée Greetings. Le code de l'interface de service est indiqué ci-dessous -

//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   String greetings(String text);
}

Nous annotons l'interface avec un @WebServicemarque. Ensuite, nous allons implémenter cette interface.

Implémentation de l'interface Web

La mise en œuvre de l'interface Web est illustrée ici -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String name) {
      return ("hi " + name);
   }
}

La méthode des salutations est annotée avec @Overridemarque. La méthode renvoie un message "salut" à l'appelant.

Ensuite, nous écrirons le code pour développer le serveur.

Développement du serveur

Contrairement à l'application POJO, nous allons maintenant découpler l'interface en utilisant la classe Endpoint fournie par CXF pour publier notre service. Cela se fait dans les deux lignes de code suivantes -

HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
   "http://localhost:9090/HelloServerPort",
   implementor,
   new LoggingFeature()
);

Le premier paramètre de la méthode de publication spécifie l'URL à laquelle notre service sera mis à disposition des clients. Le deuxième paramètre spécifie la classe d'implémentation de notre service. Le code complet du serveur est affiché ci-dessous -

//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
   public static void main(String[] args) throws Exception {
      HelloWorld implementor = new HelloWorldImpl();
      Endpoint.publish("http://localhost:9090/HelloServerPort",
      implementor,
      new LoggingFeature());
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

Pour déployer notre serveur, vous devrez apporter quelques modifications supplémentaires à votre projet comme indiqué ci-dessous.

Déploiement du serveur

Enfin, pour déployer l'application serveur, vous devrez effectuer une autre modification dans pom.xml pour configurer votre application en tant qu'application Web. Le code que vous devez ajouter à votrepom.xml est donné ci-dessous -

<profiles>
   <profile>
      <id>server</id>
      <build>
         <defaultGoal>test</defaultGoal>
         <plugins>
            <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>exec-maven-plugin</artifactId>
               <version>1.6.0</version>
               <executions>
                  <execution>
                     <phase>test</phase>
                     <goals>
                        <goal>java</goal>
                     </goals>
                     <configuration>
                        <mainClass>
                           com.tutorialspoint.cxf.jaxws.helloworld.Server
                        </mainClass>
                     </configuration>
                  </execution>
               </executions>
            </plugin>
         </plugins>
      </build>
   </profile>
</profiles>

Avant de déployer l'application, vous devez ajouter deux fichiers supplémentaires à votre projet. Ceux-ci sont indiqués dans la capture d'écran ci-dessous -

Ces fichiers sont des fichiers standard CXF qui définissent le mappage pour CXFServlet. Le code dans leweb.xml Le fichier est affiché ici pour votre référence rapide -

//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <display-name>cxf</display-name>
   <servlet>
      <description>Apache CXF Endpoint</description>
      <display-name>cxf</display-name>
      <servlet-name>cxf</servlet-name>
      <servlet-class>
         org.apache.cxf.transport.servlet.CXFServlet
      </servlet-class>
      <load-on-startup>
         1
      </load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>
         cxf
      </servlet-name>
      <url-pattern>
         /services/*
      </url-pattern>
   </servlet-mapping>
   <session-config>
      <session-timeout>60</session-timeout>
   </session-config>
</web-app>

dans le cxf-servlet.xml,vous déclarez les propriétés du point de terminaison de votre service. Ceci est montré dans l'extrait de code ci-dessous -

<beans ...>
   <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
      id = "helloHTTP"
      address = "http://localhost:9090/HelloServerPort"
      serviceName = "helloworld:HelloServiceService"
      endpointName = "helloworld:HelloServicePort">
   </jaxws:endpoint>
</beans>

Ici, nous définissons l'id de notre point de terminaison de service, l'adresse sur laquelle le service sera disponible, le nom du service et le nom du point de terminaison. Vous avez maintenant appris comment votre service est acheminé et traité par un servlet CXF.

Le pom.xml final

le pom.xmlinclut quelques dépendances supplémentaires. Plutôt que de décrire toutes les dépendances, nous avons inclus la version finale de pom.xml ci-dessous -

<?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-jaxws</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   <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>
   <profiles>
      <profile>
         <id>server</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <version>1.6.0</version>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.cxf.jaxws.helloworld.Server
                           </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.jaxws.helloworld.Client
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </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-features-logging</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
</project>

Notez qu'il comprend également un profil de création de client que nous apprendrons dans les sections ultérieures de ce didacticiel.

Exécution du service HelloWorld

Vous êtes maintenant prêt à exécuter l'application Web. Dans la fenêtre de commande, exécutez le script de construction à l'aide de la commande suivante.

mvn clean install
mvn -Pserver

Vous verrez le message suivant sur la console -

INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…

Comme précédemment, vous pouvez tester le serveur en ouvrant l'URL du serveur dans votre navigateur.

Comme nous n'avons précisé aucune opération, seul un message d'erreur est renvoyé au navigateur par notre application.

Maintenant, essayez d'ajouter le ?wsdl à votre URL et vous verrez la sortie suivante -

Notre application serveur fonctionne donc comme prévu. Vous pouvez utiliser le client SOAP tel quePostman décrit précédemment pour tester davantage votre service.

Dans la section suivante, nous allons apprendre à écrire un client qui utilise notre service.

Client en développement

L'écriture du client dans une application CXF est aussi simple que l'écriture d'un serveur. Voici le code complet pour le client -

//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
   private static final QName SERVICE_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorld");
   private static final QName PORT_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorldPort");
   private Client() {
   }
   public static void main(String[] args) throws Exception {
      Service service = Service.create(SERVICE_NAME);
      System.out.println("service created");
      String endpointAddress = "http://localhost:9090/HelloServerPort";
      service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
      endpointAddress);
      HelloWorld hw = service.getPort(HelloWorld.class);
      System.out.println(hw.greetings("World"));
   }
}

Ici, nous utilisons le CXF fourni Serviceclass pour se lier au service connu. Nous appelons lecreate méthode sur le Serviceclass pour obtenir une instance du service. Nous définissons le port connu en appelant leaddPort méthode sur le service exemple.

Maintenant, nous sommes prêts à consommer le service, ce que nous faisons en obtenant d'abord l'interface de service en appelant le getPort méthode sur le serviceexemple. Enfin, nous appelons notregreetings méthode pour imprimer le message d'accueil sur la console.

Maintenant que vous avez appris les bases de CXF en utilisant l'approche Apache CXF-First, vous allez maintenant apprendre à utiliser CXF avec l'approche WSDL-First dans notre prochain chapitre.