Mostrando entradas con la etiqueta JAX-WS. Mostrar todas las entradas
Mostrando entradas con la etiqueta JAX-WS. Mostrar todas las entradas

viernes, 17 de julio de 2015

Cliente JAX-WS con Metro para consumir servicios con seguridad UT.



En entradas anteriores hemos visto como implementar un cliente para un servicio web expuesto con seguridad UserNameToken en el WSO2 AS.

En especifico vimos como implementarlo con Axis2 y con CXF.

En esta entrada veremos como implementarlo usando la implementación de Metro a solicitud de Cesar desde el grupo de Linkedin "WSO2 en Español".

Les dejo el fuente aquí, pues ya las explicaciones han sido dadas en las entradas anteriores. Pueden probarlo desde la consola con el siguiente comando maven: mvn exec:exec

Espero les sea de utilidad.

lunes, 1 de septiembre de 2014

Introducción a WSO2 Cloud. Nueva propuesta de WSO2.

Hola a todos.

En junio, durante el evento WSO2 Con - Europe 2014 en Barcelona se lanzó la versión beta del servicio WSO2 Cloud de la empresa WSO2. Esta fue la nueva iniciativa luego de la entrega por parte de la empresa a Apache de la solución para la nube StratosLive.

Este nuevo servicio es sumamento fácil de usar. Si ya tienes una cuenta en wso2.com puedes usarla para acceder al mismo, en caso contrario y a través de esta pantalla puedes registrarte y acceder.


La primera prueba que hice fue pasar la implementación de un servicio web desarrollado en jax-ws para esta nueva plataforma y básicamente luego de autenticarse aparece la siguiente pantalla.


Ahí se selecciona App Cloud pues nuestro servicio web estará dentro de un war, ya cuando entramos a la UI debemos crear una aplicación web y esto automáticamente nos provee de un repositorio git y un espacio en jenkin para el despliegue de la aplicación.

Usando el proyecto Example3_JAX-WS expuesto en esta entrada hice los cambios necesarios en el mismo para moverlo al nuevo repo git, cuidando de no modificar los parámetros del pom.xml pues aunque les compile abajo, cuando se trate de subir al repo online les dará problemas.



En nuestro caso usamos SourceTree como cliente GIT para clonar el repo, implementamos los cambios en el servicio y automaticamente cuando se hace un commit al repo online se lanza la tarea en jenkin de compilar y desplegar la aplicación.

Ya con la aplicación desplegada y corriendo usamos el SOAPUI para crear un proyecto y probar el consumo del servicio web desarrollado con JAX-WS.

Para cerrar, revisando los blogs de los desarrolladores de WSO2 me encontré con esta entrada donde se hace un resumen de las principales funcionalidades de este servicio:

WSO2 App Cloud

  • Create applications from scratch - JSP, Jaggery, JAX-WS, JAX-RS
  • Upload existing web applications - JSP, Jaggery
  • Database provisioning for your apps
  • Life cycle management for your app - Dev, Test and Prod environments
  • Team work - A team can collaboratively work on the app
  • Issue tracking tool
  • A Git repository per each application and a build tool.
  • Cloud IDE - For your app development work
  •  And more...

WSO2 API Cloud

  • Create APIs and publish to API store (a store per tenant)
  • Subscribe to APIs in the API store
  • Tier management
  • Throttling
  • Statistics
  • Documentations for APIs

lunes, 5 de mayo de 2014

Ejemplos de uso de JAX-WS con CXF.

En esta entrada quiero dejarles el código de 3 proyectos que he usado como material de entrenamiento básico en un curso que impartí para el desarrollo de servicios usando CXF, como implementación para el API de JAX-WS.

Proyecto Example3_JAX-RS: Se implementa un servicio RESTful usando la implementación CXF para JAX-WS.

Proyecto Example3_JAX-WS: Se implementa la misma funcionalidad del ejemplo anterior pero se expone como un servicio web a partir de un WSDL ya diseñado, o sea usando el enfoque top-down.

Proyecto Example4_JAX-WS: Se implementa la misma funcionalidad de los ejemplos anteriores pero el servicio está asegurado con el escenario UserNameToken y HTTPS.

En estos ejemplos se usa Spring como mecanismo para mantener todo unido y Maven para la gestión de dependencias.

En el caso del último ejemplo uso las facilidades multimódulo de Maven para separar en módulos los diferentes aspectos que me interesan(servicio, webapp y cliente) En los casos en que se quiera exponer una lógica de negocio ya existente pues se puede crear un módulo para esta lógica de negocio, lo cual siempre facilita su reutilización.

Espero les sea de utilidad.

lunes, 24 de febrero de 2014

Implementando un cliente para un servicio en JAX-WS

Luego de ver como se implementa un servicio con JAX-WS y Metro, y desplegarlo en un contenedor de aplicaciones ahora quiero mostrarles cómo implementar un cliente para el servicio ya desplegado.

Para este caso creamos un proyecto en Maven, no usando el archetype de webapp, pues lo que queremos es un proyecto que nos genere un jar.

Una vez que tenemos el proyecto debemos modificar el pom para que queda algo como lo siguiente, ustedes hagan los cambios necesarios claro.

<?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>jaxws4</groupId>
    <artifactId>jaxws4</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>6.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.8</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-xjc</artifactId>
            <version>2.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-io</artifactId>
            <version>2.0.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jvnet.jax-ws-commons</groupId>
                <artifactId>jaxws-maven-plugin</artifactId>
                <version>2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wsimport</goal>
                        </goals>
                        <configuration>
                            <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                            <wsdlFiles>
                                <wsdlFile>helloPersonService.wsdl</wsdlFile>
                            </wsdlFiles>
                            <packageName>cu.uci.cdae.ws.client</packageName>
                            <sourceDestDir>${basedir}/target/generated-sources/</sourceDestDir>
                            <keep>true</keep>
                            <bindingFiles>
                                <bindingFile>${basedir}/src/main/resources/wsdl/binding.xml</bindingFile>
                                <bindingFile>${basedir}/src/main/resources/wsdl/jaxb-binding.xml</bindingFile>
                            </bindingFiles>
                        </configuration>
                        <phase>generate-sources</phase>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.sun.xml.bind</groupId>
                        <artifactId>jaxb-xjc</artifactId>
                        <version>2.1.12</version>
                    </dependency>
                    <dependency>
                        <groupId>com.sun.xml.ws</groupId>
                        <artifactId>jaxws-rt</artifactId>
                        <version>2.1.7</version>
                        <scope>compile</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
En la carpeta resources ponemos tanto el WSDL como el XSD en la misma ubicación, que como vimos en la entrada para crear la implementación del servicio y además en este caso añadimos 2 ficheros en la misma carpeta del WSDL. Estos ficheros son binding.xml y jaxb-binding.xml binding.xml
<bindings
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        wsdlLocation="./helloPersonService.wsdl"
        xmlns="http://java.sun.com/xml/ns/jaxws">
    <!-- Disable default wrapper style -->
    <enableWrapperStyle>false</enableWrapperStyle>

</bindings>
jaxb-binding.xml
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jaxb:globalBindings generateElementProperty="false" />
</jaxb:bindings>
Ahora solo tenemos que ejecutar el comando de Maven: mvn clean compile Y ya tendremos generadas las clases para consumir el servicio. La clase que implementará el cliente del servicio es realmente sencilla y se muestra a continuación:
package cu.uci.cdae.ws.client;

import javax.xml.ws.WebServiceRef;


public class clientews {
    @WebServiceRef(wsdlLocation = "wsdl/helloPersonService.wsdl")

    public static void main(String[] args) {
        try {

            HelloPersonService fg = new HelloPersonService();
            HelloPersonServicePortType port = fg.getHelloPersonServicePort();
   
      /* Esto se usa cuando el endpoint del WSDL no es el mismo que el del servicio real,ENDPOINT es un String que contiene el endpoint real
   ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, ENDPOINT);
   */
   
            HelloPersonServiceRequestType request = new HelloPersonServiceRequestType();
            PersonType persona = new PersonType();

            long inicio = System.currentTimeMillis();
            persona.setFirstName("Jorge");
            persona.setLastName("Infante Osorio");
            request.setPerson(persona);

            HelloPersonServiceResponseType response = port.greetPerson(request);

            System.out.println(response.getGreetings());
            System.out.println("La demora es de: " + (System.currentTimeMillis() - inicio));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}


Y de esta manera ya tenemos un cliente funcional para consumir nuestro servicio web. Es bueno aclarar que como estamos usando maven podemos usar cualquier IDE siempre y cuando lo tengamos configurado apropiadamente para que nos resuelva las dependencias vía maven.

Espero les sea de utilidad.

Despliegue de un servicio JAX-WS en tomcat y en el AS de WSO2

Desplegar un servicio jax-ws es realmente sencillo. Si seguimos los pasos de la entrada anterior, lo que tenemos que hacer ahora es ir a la carpeta  target y buscar el .war, en nuestro caso sería hello_person.war porque es el nombre que especificamos como final en el fichero pom.xml.

Para hacerlo en Tomcat:

Nos vamos donde tengamos un tomcat instalado y copiamos el fichero en [tomcat_install]\webapps

Al iniciar el tomcat podemos ir a esta ubicación:  http://localhost:8080/hello_person/helloPersonService y veremos lo siguiente:

Usando la ubicación del WSDL pueden probar el servicio usando SOAPUI, tal y como se ha mostrado en esta otra entrada.

Para hacerlo en el Application Server de WSO2:

Lo primero es tener una instancia corriendo de esta herramienta  e ir a la pestaña Main/Applications/Add/JAX-WS/JAX-RS, ahí veremos lo siguiente:
NOTA: como la implementación no es con CXF no la detecta como un servicio JAX-WS

Damos clic en Examinar, seleccionamos nuestra aplicación y le damos al botón Upload.

Una vez cargada podemos ver como se muestra:

Como en mi caso el offset está en 2 la url para acceder al servicio es la siguiente:

Espero les sea de utilidad

domingo, 23 de febrero de 2014

Introducción a JAX-WS con Maven.

Hace poco estaba leyendo un pdf de WSO2 sobre sus recomendaciones para los desarrolladores que usan esta plataforma en su día a día y mencionaban con mucho hincapié a JAX-WS y JAX-RS como las APIs preferidas por los desarrolladores para los temas de servicios web y REST.

Además de soportar los servicios axis2 y los servicios de acceso a datos, WSO2 permite el despliegue de servicios JAX-WS con la implementación de CXF y JAX-RS. Entre las ventajas que brinda la plataforma se pueden mencionar:

  • Facilidad de acceso a los almacenes de usuarios a través de las APIs de WSO2.
  • Facilidad de acceso a la API del registro de WSO2 para la persistencia de información.
  • Autorización de grano fino usando el Identity Server de WSO2.
  • Una interfaz gráfica amigable para la gestión de las aplicaciones que contienen los servicios desplegados.
  • Despliegue y actualización en caliente de los servicios web.

Para comenzar a adentrarnos en JAX-WS lo haremos primero con Metro, luego pasaremos a CXF y veremos como desplegar estas aplicaciones en el AS con las facilidades antes mencionadas.

En esta entrada veremos cómo implementar un servicio web en JAX-WS con la ayuda de Maven.
Se implementa el escenario en el cual tenemos un WSDL ya diseñado y queremos implementar el servicio a partir de dicho WSDL. El cual mostramos a continuación:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
        name="helloPersonService"
        targetNamespace="http://example.nl/hellopersonservice/1.0"
        xmlns:tns="http://example.nl/hellopersonservice/1.0"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
        >
    <wsdl:types>
        <xsd:schema targetNamespace="http://example.nl/hellopersonservice/1.0">
            <xsd:import schemaLocation="../xsd/helloPersonService.xsd"
                        namespace="http://example.nl/hellopersonservice/1.0"/>
        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="HelloPersonServiceRequest">
        <wsdl:part name="HelloPersonServiceRequest" element="tns:HelloPersonServiceRequest"/>
    </wsdl:message>
    <wsdl:message name="HelloPersonServiceResponse">
        <wsdl:part name="HelloPersonServiceResponse" element="tns:HelloPersonServiceResponse"/>
    </wsdl:message>
    <wsdl:portType name="HelloPersonServicePortType">
        <wsdl:operation name="greetPerson">
            <wsdl:input name="HelloPersonServiceRequest" message="tns:HelloPersonServiceRequest"/>
            <wsdl:output name="HelloPersonServiceResponse" message="tns:HelloPersonServiceResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="HelloPersonServiceBinding" type="tns:HelloPersonServicePortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="greetPerson">
            <soap:operation style="document" soapAction="http://example.nl/HelloPersonService/greetPerson"/>
            <wsdl:input name="HelloPersonServiceRequest">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="HelloPersonServiceResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="HelloPersonService">
        <wsdl:port name="HelloPersonServicePort" binding="tns:HelloPersonServiceBinding">
            <soap:address location="/service/helloPersonService" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Y como este wsdl referencia a un XSD también les mostramos el XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified"
            xmlns="http://example.nl/hellopersonservice/1.0"
            targetNamespace="http://example.nl/hellopersonservice/1.0">
    <xsd:element name="HelloPersonServiceRequest" type="HelloPersonServiceRequestType"/>
    <xsd:element name="HelloPersonServiceResponse" type="HelloPersonServiceResponseType"/>

    <xsd:complexType name="HelloPersonServiceRequestType">
        <xsd:element name="Person" type="PersonType"/>
    </xsd:complexType>

    <xsd:complexType name="HelloPersonServiceResponseType">
        <xsd:element name="Greetings" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="PersonType">
        <xsd:sequence>
            <xsd:element name="FirstName" type="xsd:string"/>
            <xsd:element name="LastName" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>


Comencemos a implementar nuestro servicio web usando JAX-WS.

Paso 1: Crear una aplicación web en Maven. Para aquellos que no saben les recomiendo este enlace.

Paso 2: incluir la dependencia de jax-ws en su fichero pom.xml. les muestro el pom.xml completo del proyecto


<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jaxws3</groupId>
  <artifactId>jaxws3</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>jaxws3 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
      <dependency>
          <groupId>javax</groupId>
          <artifactId>javaee-web-api</artifactId>
          <version>6.0</version>
          <scope>provided</scope>
      </dependency>
   <!-- Dependencia de JAX-WS-->
      <dependency>
          <groupId>com.sun.xml.ws</groupId>
          <artifactId>jaxws-rt</artifactId>
          <version>2.2.8</version>
          <scope>compile</scope>
      </dependency>
      <dependency>
          <groupId>com.sun.xml.bind</groupId>
          <artifactId>jaxb-xjc</artifactId>
          <version>2.2.6</version>
      </dependency>
      <dependency>
          <groupId>org.codehaus.plexus</groupId>
          <artifactId>plexus-io</artifactId>
          <version>2.0.6</version>
      </dependency>
  </dependencies>
  <build>
    <!-- Nombre que tendra la aplicacion web-->
    <finalName>hello_person</finalName>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>2.0.2</version>
              <configuration>
                  <source>1.7</source>
                  <target>1.7</target>
              </configuration>
          </plugin>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-war-plugin</artifactId>
              <version>2.2</version>
              <configuration>
                  <failOnMissingWebXml>false</failOnMissingWebXml>
              </configuration>
          </plugin>
           
          <plugin>
              <groupId>org.mortbay.jetty</groupId>
              <artifactId>jetty-maven-plugin</artifactId>
              <configuration>
                  <webAppConfig>
                      <contextPath>hello_person</contextPath>
                  </webAppConfig>
                  <connectors>
                      <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                          <port>8083</port>
                      </connector>
                  </connectors>
              </configuration>
          </plugin>

          <plugin>
              <groupId>org.codehaus.mojo</groupId>
              <artifactId>build-helper-maven-plugin</artifactId>
              <version>1.8</version>
              <executions>
                  <execution>
                      <id>add-source</id>
                      <phase>generate-sources</phase>
                      <goals>
                          <goal>add-source</goal>
                      </goals>
                      <configuration>
                          <sources>
                              <source>${basedir}/target/generated/src/main/java</source>
                          </sources>
                      </configuration>
                  </execution>
              </executions>
          </plugin>
          <!-- Plugin para generar el codigo a partir del WSDL del servicio web-->
          <plugin>
              <groupId>org.jvnet.jax-ws-commons</groupId>
              <artifactId>jaxws-maven-plugin</artifactId>
              <version>2.1</version>
              <configuration>
                  <sei>cu.uci.cdae.hello_person.service.HelloPersonServiceImpl</sei>
                  <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory>
                  <packageName>cu.uci.cdae.hello_person.service.generated</packageName>
                  <keep>true</keep>
                  <sourceDestDir>${basedir}/target/generated/src/main/java</sourceDestDir>
              </configuration>
              <executions>
                  <execution>
                      <goals>
                          <goal>wsimport</goal>
                      </goals>
                  </execution>
              </executions>
              <dependencies>
                  <dependency>
                      <groupId>com.sun.xml.bind</groupId>
                      <artifactId>jaxb-xjc</artifactId>
                      <version>2.1.12</version>
                  </dependency>
                  <dependency>
                      <groupId>com.sun.xml.ws</groupId>
                      <artifactId>jaxws-rt</artifactId>
                      <version>2.1.7</version>
                      <scope>compile</scope>
                  </dependency>
              </dependencies>
          </plugin>
      </plugins>
  </build>
</project>

Paso 3: incluir el plugin para Maven de JAX-WS, el cual pueden ver en el pom.xml. Este plugin nos permite generar el código del servicio web a partir del WSDL. Su configuración es bastante sencilla y debemos especificarle la ubicación del wsdl, el paquete donde se generará el código, si mantenemos el fuente generado pues por defecto se borran los .java y solo quedan los compilados, y por último el destino de donde pondremos el fuente generado.


Paso 4: crear un carpeta en [proyecto]\src\main\resources\ con el nombre wsdl que es donde se pondrá el wsdl diseñado y otra xsd que es donde se pondrá el xsd referenciado por el wsdl.

Paso 5: debemos ir a [proyecto]\ src\main\webapp\WEB-INF\ y crear 2 ficheros sun-jaxws.xml y web.xml cuyo contenido es el siguiente.

fichero sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?>
<endpoints
        xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
        version='2.0'>
    <endpoint
            name='helloPersonService'
            implementation='cu.uci.cdae.hello_person.service.HelloPersonServiceImpl'
            url-pattern='/helloPersonService' />
</endpoints>

fichero 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"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <listener>
        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
        <description>JAX-WS endpoint</description>
        <display-name>The JAX-WS servlet</display-name>
        <servlet-name>jaxws</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/helloPersonService</url-pattern>
    </servlet-mapping>
</web-app>


En sun-jaxws.xml definimos el endpoint que usaremos, el patrón para la URL y la clase que implementa este endpoint.
En web.xml definimos el Servlet y el mapeo que usaremos.

Llegado este punto podemos ir a la raíz del proyecto y ejecutar el siguiente comando Maven:
mvn clean compile

En la carpeta /target/generated/src/main/java y en el paquete cu.uci.cdae.hello_person.service.generated tendremos el código generado automáticamente.

Paso 5: implementar la lógica de negocio del servicio.
Si revisaron el WSDL verán que recibimos un objeto persona que tiene nombre y apellidos y se devuelve un String.

La clase que implementa el  servicio es la siguiente:

package cu.uci.cdae.hello_person.service;

import cu.uci.cdae.hello_person.service.generated.HelloPersonServiceRequestType;
import cu.uci.cdae.hello_person.service.generated.HelloPersonServiceResponseType;

import javax.jws.WebService;

@WebService(endpointInterface = "cu.uci.cdae.hello_person.service.generated.HelloPersonServicePortType")
public class HelloPersonServiceImpl implements cu.uci.cdae.hello_person.service.generated.HelloPersonServicePortType {

    @Override
    public HelloPersonServiceResponseType greetPerson(HelloPersonServiceRequestType helloPersonServiceRequest) {
        HelloPersonServiceResponseType helloPersonServiceResponse = new HelloPersonServiceResponseType();
        helloPersonServiceResponse.setGreetings("Hello " + helloPersonServiceRequest.getPerson().getFirstName() + " " + helloPersonServiceRequest.getPerson().getLastName() + "!");
        return helloPersonServiceResponse;
    }

}

Como pueden ver la implementación es realmente limpia. La clase es anotada para que sea contemplada como uun servicio web y especificamos la interfaz del endpoint. Esta clase debe implementar dicha interfaz y acepta  un objeto que contiene la estructura de la persona definida en el XSD que vimos al inicio.

Lo que nos queda ahora es empaquetar nuestro servicio usando el siguiente comando de maven:
mvn clean package

Y el war generado desplegarlo en un Tomcat o en el AS de WSO2

Espero les sea de utilidad