Apache CXF con POJO

En este capítulo, aprenderá a desarrollar una aplicación web sencilla que envíe un mensaje de saludo al usuario. Un proyecto de servicio web utiliza el modelo WSDL . El CXF le permite ocultar este modelo WSDL proporcionando una interfaz simple para mapear las API de Apache CXF al WSDL subyacente.

En este proyecto más simple, la interfaz del servicio web se expondrá directamente al cliente y el cliente usaría las API nativas de Apache CXF para llamar al servicio web.

Primero, crearemos un servicio web. Cada servicio tiene una interfaz que está expuesta al cliente. Podemos escribir esta interfaz como una interfaz Apache CXF simple o como un documento WSDL. En este enfoque de Apache CXF-First, expondremos nuestro servicio a través de una interfaz Apache CXF.

Desarrollo de servicio web

El servicio que vamos a crear en la web tendrá un único método web llamado greetings. El método toma unstringtipo argumento en el que enviaremos el nombre del usuario. El servicio enviará un mensaje de saludo a la persona que llama con el nombre de usuario recibido incluido en el mensaje.

Interfaz de servicio web

Para exponer la interfaz de nuestro servicio web, crearemos una interfaz Apache CXF de la siguiente manera:

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

La interfaz tiene solo un método llamado greetings. El servidor implementará esta interfaz. En nuestra aplicación trivial, esta interfaz se expone directamente al cliente. Normalmente, en una aplicación de servicio web, utiliza WSDL para describir la interfaz del servicio web. En esta sencilla aplicación, proporcionaremos esta interfaz directa al desarrollador del cliente. El cliente entonces llamaría algreetingsmensaje en el objeto del servidor. Primero, creemos el servicio web.

Implementación de servicios web

los HelloWorld La interfaz está implementada en el HelloWorldImpl Clase Apache CXF como se muestra a continuación -

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

los greetings El método recibe un parámetro de string type, lo agrega a un mensaje de saludo y devuelve la cadena resultante a la persona que llama.

A continuación, escribimos la aplicación del servidor para alojar el HelloWorld Servicio.

Creando servidor

La aplicación del servidor consta de dos partes:

  • La primera parte crea una fábrica para nuestro servicio web y

  • La segunda parte escribe un main método para instanciarlo.

El servidor usa ServerFactoryBean clase proporcionada por las bibliotecas CXF para exponer nuestra HelloWorldinterfaz a clientes remotos. Por lo tanto, primero instanciamos elServerFactoryBean class y luego establecer sus diversas propiedades -

ServerFactoryBean factory = new ServerFactoryBean();

Configuramos la clase de servicio para ser llamada llamando al setServiceClass método en el factory objeto -

factory.setServiceClass(HelloWorld.class);

Configuramos la URL para llamar a nuestro servicio llamando a la fábrica setAddressmétodo. Tenga en cuenta que el servicio se publicará en esta URL.

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

En este caso, el servicio se implementa en el servidor integrado y estará escuchando el puerto 5000. Puede optar por cualquier número de puerto de su elección.

Antes de crear la fábrica, debe informar a la fábrica sobre nuestra clase de implementación de servicio. Esto se hace llamando alsetServiceBean método en el factory objeto como se muestra aquí -

factory.setServiceBean(new HelloWorldImpl());

El bean de servicio se establece en la instancia de nuestra clase de implementación de servicio. Finalmente, creamos la fábrica llamando a sucreate método -

factory.create();

Ahora, como hemos desarrollado la fábrica para ejecutar nuestro servicio web, a continuación escribiremos un main método para instanciarlo y mantenerlo en ejecución durante algún tiempo.

Ahora, escribe un main método para instanciar el HelloServer clase de la siguiente manera -

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

Una vez instanciado, el HelloServerla clase seguirá funcionando indefinidamente. Para implementaciones de producción, definitivamente mantendrá su servidor en funcionamiento para siempre. En la situación actual, terminaríamos el servidor después de un tiempo predeterminado de la siguiente manera:

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

El código completo para el HelloServer la clase se da a continuación -

//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);
   }
}

La aplicación de servidor que hemos creado utiliza ServerFactoryBeanclase de las bibliotecas CXF. Ahora debemos incluir estas bibliotecas en nuestro proyecto para compilar con éxito elHelloServerclase. UsaremosMaven para configurar las dependencias del proyecto.

Configuración del proyecto Maven

Para crear un proyecto Maven, escriba el siguiente comando en su ventana de línea de comandos. Tenga en cuenta que hemos probado esto en una máquina Mac. Para las instalaciones de Windows y Linux, las instrucciones pueden diferir en algunos lugares.

mvn archetype:generate

Cuando se le pregunte por las propiedades, ingrese los siguientes valores:

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

Al completar el comando maven, encontrará la estructura de carpetas apropiada creada en su carpeta actual junto con el archivo pom.xml.

La estructura de directorios generada se muestra aquí:

Agregará las dependencias CXF en el pom.xmly también copie los archivos Apache CXF creados anteriormente en la carpeta apropiada de la estructura creada por maven. Para su referencia inmediata, le proporcionamos a continuación el archivo pom.xml para el proyecto que creamos en nuestra máquina.

<?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>

El pom.xml anterior puede incluir dependencias adicionales que son irrelevantes para este proyecto, pero son necesarias para nuestro próximo proyecto en este tutorial. De todos modos, no hay nada de malo en incluir dependencias adicionales.

Estructura de carpetas del proyecto

La estructura de la carpeta del proyecto en mi máquina después de colocar el servidor y los archivos del cliente Apache CXF se muestra a continuación para su referencia rápida:

Servidor en ejecución

Para construir el proyecto, use el siguiente comando en su ventana de línea de comandos:

mvn clean install

Puede iniciar el servidor usando el siguiente comando:

mvn -Pserver

Esto iniciará el servidor y verá el siguiente mensaje en la consola:

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

Ahora, en la ventana de su navegador, especifique la URL de nuestro servicio publicado. Verá la siguiente salida:

Esto confirma que nuestro servicio se está ejecutando en el puerto especificado en un host local. Dado que no especificamos elgreetings mensaje en nuestra llamada, se devuelve un mensaje de error SOAP al navegador.

Puede seguir probando su servicio web utilizando un cliente SOAP de su elección. Aquí hemos utilizado Postman para probar nuestro servidor.

La salida es como se muestra aquí:

Observa eso SOAP Requestfue codificado a mano. Después de publicar la solicitud, el servidor envió unSOAP Response mensaje, que se ve en la parte inferior de la captura de pantalla.

A partir de esto, puede comprender que CXF mantiene el uso de protocolos SOAP tanto para la solicitud como para la respuesta, mientras le brinda una vista unificada de una variedad de tecnologías web que existen en el mundo actual. Esto simplifica enormemente el desarrollo de aplicaciones web.

Nuestra siguiente tarea es crear un cliente que consumirá el servicio web que ha creado.

Crear cliente

En la aplicación del servidor HelloWorldes la interfaz que expone nuestro servicio web. El servicio web en sí solo proporciona un mensaje de bienvenida sencillo al cliente. Por lo general, la interfaz del servicio web se expone al mundo exterior mediante WSDL (lenguaje de descripción de servicios web). En esta trivial aplicación, expondremos nuestro servicio web al cliente exponiendo directamente la interfaz del servicio y esa es laHelloWorld.class.

Para este propósito, CXF proporciona una clase de fábrica llamada ClientProxyFactoryBean que nos permite adjuntar a la interfaz deseada a la instancia de fábrica creada.

Primero, creamos una instancia de bean de fábrica de la siguiente manera:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

Llamamos al setAddressen la instancia de bean de fábrica para establecer la URL mediante la cual se puede invocar nuestro servicio web. En nuestro caso, usaremos la URL utilizada al crear el servidor en nuestro paso anterior:

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

A continuación, llamamos al create método en el factory instancia para adjuntar nuestra interfaz de servicio HelloWorld.class lo.

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

Finalmente, llamamos al greetings método para invocar el servicio web remoto.

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

Esto imprimiría un mensaje de saludo en su consola.

La fuente completa de la aplicación cliente se muestra a continuación:

//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")));
   }
}

Cliente en ejecución

Asegúrese de que el servidor aún se esté ejecutando en su máquina. En caso de que se agote el tiempo de espera, reinicie el servidor con el siguiente comando:

mvn -Pserver

Verá el siguiente mensaje en la consola:

Listening on port 5000 ...

Ahora, antes de que el servidor se agote, lo que hemos establecido en 5 minutos, abra otra ventana de línea de comando e inicie el cliente con el siguiente comando:

mvn -Pclient

Verá un mensaje similar al siguiente en la línea de comando:

Hi tutorialspoint

Tenga en cuenta que tutorialspointes nuestro nombre de usuario. Recibirás un saludo con tu propio nombre.

En el próximo capítulo, aprenderemos cómo usar CXF en un proyecto JAX-WS (Apache CXF API para servicios web XML).