Apache CXF con JAX-WS

En esta aplicación JAX-WS, usaremos el primer enfoque de Apache CXF como la aplicación POJO anterior. Entonces, primero crearemos una interfaz para nuestro servicio web.

Declaración de interfaz de servicio

Como en el caso anterior, crearemos un servicio trivial que solo tiene un método de interfaz llamado saludos. El código para la interfaz de servicio se muestra a continuación:

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

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

Anotamos la interfaz con un @WebServiceetiqueta. A continuación, implementaremos esta interfaz.

Implementación de la interfaz web

La implementación de la interfaz web se muestra aquí:

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

El método de los saludos está anotado con @Overrideetiqueta. El método devuelve un mensaje de "hola" a la persona que llama.

A continuación, escribiremos el código para desarrollar el servidor.

Servidor de desarrollo

A diferencia de la aplicación POJO, ahora desacoplaremos la interfaz utilizando la clase Endpoint proporcionada por CXF para publicar nuestro servicio. Esto se hace en las siguientes dos líneas de código:

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

El primer parámetro del método de publicación especifica la URL en la que nuestro servicio estará disponible para los clientes. El segundo parámetro especifica la clase de implementación de nuestro servicio. El código completo para el servidor se muestra a continuación:

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

Para implementar nuestro servidor, deberá realizar algunas modificaciones más en su proyecto, como se indica a continuación.

Implementación del servidor

Finalmente, para implementar la aplicación del servidor, deberá realizar una modificación más en pom.xml para configurar su aplicación como una aplicación web. El código que necesita agregar a supom.xml se da a continuación -

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

Antes de implementar la aplicación, debe agregar dos archivos más a su proyecto. Estos se muestran en la captura de pantalla a continuación:

Estos archivos son archivos estándar CXF que definen la asignación para CXFServlet. El código dentro delweb.xml El archivo se muestra aquí para su referencia rápida -

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

En el cxf-servlet.xml,declara las propiedades para el punto final de su servicio. Esto se muestra en el fragmento de código a continuación:

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

Aquí definimos la identificación de nuestro punto final de servicio, la dirección en la que estará disponible el servicio, el nombre del servicio y el nombre del punto final. Ahora, aprendió cómo un servlet CXF enruta y procesa su servicio.

El pom.xml final

los pom.xmlincluye algunas dependencias más. En lugar de describir todas las dependencias, hemos incluido la versión final de pom.xml a continuación:

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

Tenga en cuenta que también incluye un perfil para compilar el cliente que aprenderemos en las secciones posteriores de este tutorial.

Ejecución del servicio HelloWorld

Ahora, está listo para ejecutar la aplicación web. En la ventana de comandos, ejecute el script de compilación con el siguiente comando.

mvn clean install
mvn -Pserver

Verá el siguiente mensaje en la consola:

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

Como antes, puede probar el servidor abriendo la URL del servidor en su navegador.

Como no especificamos ninguna operación, nuestra aplicación solo devuelve un mensaje de error al navegador.

Ahora, intente agregar el ?wsdl a su URL y verá el siguiente resultado:

Entonces, nuestra aplicación de servidor se está ejecutando como se esperaba. Puede utilizar el cliente SOAP comoPostman descrito anteriormente para probar más su servicio.

En la siguiente sección, aprenderemos cómo escribir un cliente que utiliza nuestro servicio.

Cliente en desarrollo

Escribir el cliente en una aplicación CXF es tan trivial como escribir un servidor. Aquí está el código completo para el cliente:

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

Aquí, utilizamos el CXF suministrado Serviceclass para enlazar con el servicio conocido. Llamamos alcreate método en el Serviceclass para obtener una instancia del servicio. Configuramos el puerto conocido llamando aladdPort método en el service ejemplo.

Ahora, estamos listos para consumir el servicio, lo que hacemos obteniendo primero la interfaz del servicio llamando al getPort método en el serviceejemplo. Finalmente, llamamos a nuestrogreetings método para imprimir el mensaje de saludo en la consola.

Ahora, como ha aprendido los conceptos básicos de CXF utilizando el enfoque Apache CXF-First, ahora aprenderá cómo usar CXF con el enfoque WSDL-First en nuestro próximo capítulo.