Generación de Servicios Web Con JAVA

Post on 15-Jan-2016

63 views 0 download

description

Como hacer un servicio web en eclipse

Transcript of Generación de Servicios Web Con JAVA

Generación de servicios web con JAVAPrerequisitos......................................................................................................................................2

Verificación del jdk configurado por defecto en eclipse.................................................................2

Configuración de tomcat....................................................................................................................6

Agregar el servidor.........................................................................................................................6

Configuración de deploy................................................................................................................9

Configuración de puerto para el servidor tomcat........................................................................10

Implementación de un servicio web con java..................................................................................11

Creación del proyecto para implementar el servicio web............................................................11

WSDL........................................................................................................................................20

XSD...........................................................................................................................................21

Implementación de la parte servidora del servicio web...............................................................22

Generación de clases del servicio web.....................................................................................22

Despliegue del servicio web.....................................................................................................31

Implementación del cliente del servicio web...............................................................................35

Generación de clases para el cliente........................................................................................35

Creación de prueba unitaria.....................................................................................................37

Prerequisitos

Verificación del jdk configurado por defecto en eclipse1. Se elige la opción Window/Preferences

2. En la sección Java/Installed JREs se verifica que se tenga un jdk seleccionado por defecto.

3. En caso de no tener alguno, se debe instalar el jdk en una ruta sin espacios en blanco: C:\opt\Java\jdk1.7.0_51 (Observe que en este ejemplo se utiliza la unidad C, aún y cuando se tenga unidad D, porque en D se guardan datos, y en C el sistema operativo y software instalable.

a. Después de instalado el jdk, se tiene que agregar en el eclipse con la opción “Add” de Installed JREs y en el cuadro de diálogo que aparece elegir Standard VM:

b. Lo único que se tiene que se configura es la ruta del jdk requerido y se finaliza:

Configuración de tomcat

Agregar el servidor1. Se da clic derecho en la vista de “Severs” y se elige New/Server:

2. Se elige el servidor Tomcat v7.0 Server y se modifica su nombre agregando “.19” para que coincida con la versión a utilizar.

3. A continuación se elige el directorio donde se tenga descomprimido el tomcat (D:\opt\apache-tomcat-7.0.19, OJO: sobre opt para no tener espacios en blanco) y se elige Next:

4. En la última pantalla sólo se elige “Finish”

Configuración de deploy1. Con doble clic sobre el sevidor agregado se configura la ruta de despliegue del tomcat, en

Server Locations se elige “Use Tomcat installation (takes control of Tomcat installation)” para que nuestras aplicaciones se desplieguen en la ruta real del tomcat, y NO en una ruta temporal de eclipse. En el deploy path se modifica a “webapps” porque es la ruta que ya existe en el tomcat para desplegar aplicaciones:

Configuración de puerto para el servidor tomcat1. Con doble clic sobre el sevidor agregado se puede modificar el puerto HTTP que utilizará el

tomcat para desplegar las aplicaciones.

Implementación de un servicio web con java

Creación del proyecto para implementar el servicio web1. Con un clic derecho sobre la vista de Project Explorer se elige New/Project

2. Se elige un Java Project

3. Se asigna un nombre al proyecto y se configura el folder de código fuente eligiendo la opción “Configure default…”

4. Se cambia el folder de fuentes por defecto a src/main/java y se da clic en Ok.

5. Al avanzar en el wizard de la creación del proyecto ya se verá reflejado el source folder configurado.

6. En la pestaña de “Libraries” se agregan todos los jar de framework de axis2 que se ubican en su ruta donde se descomprimió (D:\opt\axis2-1.6.2\lib)

7. Al finalizar la creación del proyecto se verá en la sección de “Project Explorer” como se muestra a continuación:

8. Para que no esté visible una lista tan grande de jars, se puede filtrar la vista del “Project Explorer” eligiendo el pequeño triángulo que aparece en su sección superior y la opción “Customize View”

9. Se elige que se quiere ocultar las librerías externas:

10. Se tendrá la vista filtrada para tener más limpio el proyecto:

11. Se elige la opción de crear un nuevo folder (no source folder) en la raíz del proyecto:

12. Se crea el folder src/main/wsdl

13. Dentro de la carpeta creada se copian los archivos .wsdl y .xsd

WSDL<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://itq.edu/soa/miOperacion" targetNamespace="http://itq.edu/soa/miOperacion">

<wsdl:types><xs:schema targetNamespace="http://itq.edu/soa/miOperacion"

elementFormDefault="qualified"><xs:include schemaLocation="operacion.xsd"/>

</xs:schema></wsdl:types><wsdl:message name="MessageRequest">

<wsdl:part name="parameter" element="tns:request"/></wsdl:message><wsdl:message name="MessageResponse">

<wsdl:part name="parameter" element="tns:response"/></wsdl:message><wsdl:portType name="miOperacionPortType">

<wsdl:operation name="miOperacionOperation"><wsdl:input message="tns:MessageRequest"/><wsdl:output message="tns:MessageResponse"/>

</wsdl:operation></wsdl:portType><wsdl:binding name="miOperacionBinding" type="tns:miOperacionPortType">

<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

<wsdl:operation name="miOperacionOperation"><soap:operation soapAction="urn:#miOperacionOperation"/><wsdl:input>

<soap:body use="literal"/></wsdl:input><wsdl:output>

<soap:body use="literal"/></wsdl:output>

</wsdl:operation>

</wsdl:binding><wsdl:service name="miOperacionService">

<wsdl:port name="miOperacionPort" binding="tns:miOperacionBinding"><soap:address

location="http://localhost:8080/axis2/services/miOperacionService?wsdl"/></wsdl:port>

</wsdl:service></wsdl:definitions>

XSD<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:miop="http://itq.edu/soa/miOperacion" targetNamespace="http://itq.edu/soa/miOperacion" elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:element name="request"><xs:complexType>

<xs:sequence><xs:element name="cadena" type="xs:string"/>

</xs:sequence></xs:complexType>

</xs:element><xs:element name="response">

<xs:complexType><xs:sequence>

<xs:element name="cadena" type="xs:string"/></xs:sequence>

</xs:complexType></xs:element>

</xs:schema>

Implementación de la parte servidora del servicio web

Generación de clases del servicio web1. Se copia el archivo build.xml en la raíz del proyecto

<?xml version="1.0" encoding="UTF-8"?><project name="MiOperacion" default="package-server" basedir="."> <property file="build.properties"/> <property name="axis-lib" location="${axis-home}/lib"/> <property name="wsdl-name" value="${wsdl.name}"/> <property name="client-path" location="${client.path}"/> <property name="client-package-name" value="${client.package}"/> <property name="client-wsdl-uri" value="${wsdl.uri}"/> <property name="rutaserver" location="${server.path}"/> <property name="server-package-name" value="${server.package}"/> <property name="server-wsdl-uri" value="${wsdl.uri}"/> <property environment="env"/> <property name="tomcat_home" value="${catalina-home}"/> <property name="tomcat_deployment" value="${tomcat_home}\webapps"/> <property name="axis2_deployment" value="${tomcat_deployment}\axis2\WEB-INF\services"/> <path id="axis-classpath"> <fileset dir="${axis-home}/lib" includes="**/*.jar"/> </path> <target name="all-client" depends="clean-client,generate-client,compile-client,package-client"/> <target name="clean-client"> <echo message="Eliminando archivos java, class y jar"/> <delete quiet="true" dir="${client-path}"/> <delete quiet="true" file="${wsdl-name}.jar"/> </target> <target name="clean-server"> <echo message="Eliminando archivos java, class y aar"/> <delete quiet="true" dir="${rutaserver}"/> <delete quiet="true" file="${wsdl-name}.aar"/> </target> <target name="sclean-server"> <echo message="Eliminando archivos java, class y aar"/> <delete quiet="true" dir="${rutaserver}"/> <delete quiet="true" file="${wsdl-name}.aar"/> </target> <!-- Generate server linkage code from WSDL--> <target name="generate-server"> <echo message="Eliminando archivos java, class y aar"/> <delete quiet="true" dir="${rutaserver}"/>

<delete quiet="true" file="${wsdl-name}.aar"/> <echo message="Ejecutando WSDL2Java"/> <mkdir dir="${rutaserver}"/> <java classpathref="axis-classpath" fork="true" classname="org.apache.axis2.wsdl.WSDL2Java"> <!-- Generate async style server-code --> <!-- arg value="-a" --> <!-- Path donde se generara el codigo --> <!--arg value="-o" /> <arg value="${rutaserver}"/--> <!-- Specify a custom package name for the generated code --> <arg value="-p"/> <arg value="${server-package-name}"/> <!-- -S Source destination --> <arg value="-S"/> <arg value="server"/> <!-- -R Resources destination --> <arg value="-R"/> <arg value="src/main/resources"/> <!-- Valid databinding --> <arg value="-d"/> <arg value="adb"/> <!-- -ss parameter says generate server code --> <arg value="-ss"/> <!-- -sd parameter says generate server deployment files , i.e services.xml --> <arg value="-sd"/> <!-- Unpacks de databinding classes --> <!--arg value="-u"--> <!-- -uw parameter unwraps the request messages --> <!--arg value="-uw"--> <!-- url o path --> <arg value="-uri"/> <arg value="${server-wsdl-uri}"/> </java> <!-- Replace implementation class in deployment descriptor --> <!-- replace file="src/main/resources/services.xml" token="Skeleton" value="Impl"/--> <!-- echo message="Copiando clase principal del archivo temporal"/--> <!--copy file="temp/VobbServiceConfServiceImpl.java" todir="${serverpath}/com/serviceplatform/vobb/service/server/"/--> </target> <target name="generate-client"> <echo message="Running WSDL2Java task"/> <mkdir dir="${client-path}"/> <java classpathref="axis-classpath" fork="true" classname="org.apache.axis2.wsdl.WSDL2Java"> <!-- -o parameter sets the output root directory --> <arg value="-o"/> <arg value="${client-path}"/> <!-- -p parameter gives the package for Axis2 code generation --> <arg value="-p"/> <arg value="${client-package-name}"/>

<!-- -d parameter selects the databinding framework --> <arg value="-d"/> <arg value="adb"/> <!-- -u parameter unbundles data object classes --> <!--arg value="-u"/--> <!-- -uw parameter unwraps the request messages --> <!--arg value="-uw"/--> <!-- -s generates synchronous methods only --> <arg value="-s"/> <!-- -uri parameter provides the WSDL input --> <arg value="-uri"/> <arg value="${client-wsdl-uri}"/> </java> </target> <!-- Compile server code for deployment --> <target name="compile-server"> <delete quiet="true" dir="${rutaserver}/bin"/> <mkdir dir="${rutaserver}/bin"/> <!-- Compile the generated code --> <javac srcdir="${rutaserver}" destdir="${rutaserver}/bin" nowarn="${nowarn}" debug="true" deprecation="true"> <classpath> <path refid="axis-classpath"/> <pathelement path="${rutaserver}/bin"/> </classpath> </javac> </target> <target name="compile-client"> <delete quiet="true" dir="${client-path}/bin"/> <mkdir dir="${client-path}/bin"/> <!-- Compile the generated code --> <javac srcdir="${client-path}" destdir="${client-path}/bin" nowarn="${nowarn}" debug="true"> <classpath> <path refid="axis-classpath"/> <pathelement path="${client-path}/bin"/> </classpath> </javac> <!-- Compile the implementation classes --> <javac srcdir="${client-path}/src" destdir="${client-path}/bin" nowarn="${nowarn}" debug="true"> <classpath> <path refid="axis-classpath"/> <pathelement path="${client-path}/bin"/> </classpath> </javac> <copy file="log4j.properties" todir="${client-path}/bin"/> </target> <!-- Package server code as .aar file --> <target name="package-server"> <echo message="Copiando clase principal del archivo temporal"/> <jar jarfile="${wsdl-name}.aar" basedir="bin"> <metainf file="src/main/wsdl/services.xml"/> <metainf file="src/main/wsdl/${wsdl-name}.wsdl"/> <metainf file="src/main/wsdl/*.xsd"/>

<manifest> <attribute name="Funcionalidad" value="Web service de ejemplo"/> </manifest> </jar> </target> <target name="deploy" depends="package-server"> <echo message="Copiando archivo aar al directorio ${axis2_deployment}"/> <copy todir="${axis2_deployment}" file="${wsdl-name}.aar"/> </target> <!-- Package client code as .jar file --> <target name="package-client"> <jar jarfile="${wsdl-name}.jar" basedir="${client-path}/bin"/> </target> <target name="file-exists-then-fail"> <condition property="previousImplementation" value="true"> <not> <available file="log4j.properties" filepath="."/> </not> </condition> <fail unless="previousImplementation" message="A Previous Implementation exists, please run backup task"/> </target></project>

2. Se copia el archivo build.properties también en la raíz del proyecto

catalina-home=D:\\opt\\apache-tomcat-7.0.19axis-home=D:\\opt\\axis2-1.6.2wsdl.name=operacionserver.path=./serverserver.package=edu.itq.soa.mioperacion.serverclient.path=./clientclient.package=edu.itq.soa.mioperacion.clientwsdl.uri=./src/main/wsdl/operacion.wsdl

a. catalina-home es la ruta del tomcatb. axis-home es la ruta donde se descomprimió el axis2c. wsdl.name es el nombre del archivo .wsdl y el nombre del archivo .aar a generar.d. server.path es la ruta donde se generarán las clases del servicio web.e. server.package es el paquete de las clases del servicio web a generar.

f. client.path es la ruta donde se generarán las clases para generar un cliente del servicio web.

g. client.package es el paquete de las clases para generar un cliente del servicio web.h. ssdl.uri es la ruta de dónde se tomará el archivo .wsdl para generar la parte

servidora y cliente.3. Se configuran las propiedades para que se pueda generar el código de la implementación

del servicio web.4. Se arrastra el archivo build.xml en la vista de “Ant”.

5. Se expanden las tareas de ant y se ejecuta generate-server.

6. Se presentará en la consola el resultado de la ejecución:

7. Se refresca el árbol del proyecto:

8. En la carpeta configurada se habrán generado las clases del servicio web:

9. Para la implementación del servicio web se requiere mover o copiar las clases generadas en la carpeta server a el source folder del proyecto (src/main/java). Se puede hacer con la vista de “Remote Systems” o desde un explorador de archivos de Windows:

10. Se pega en la carpeta del source folder desde la vista de “Remote Systems” o el explorador de Windows.

11. Refrescando la vista del proyecto podremos ver las clases compiladas en el source folder:

12. Se implementa el Skeleton, que es la clase que contiene al método que representa al servicio web a exponerse. La implementación consta de cumplir con el contrato definido, en este caso es responder un objeto de tipo Response:

/** * MiOperacionServiceSkeleton.java * * This file was auto-generated from WSDL * by the Apache Axis2 version: 1.6.2 Built on : Apr 17, 2012 (05:33:49 IST) */package edu.itq.soa.mioperacion.server;

import edu.itq.soa.mioperacion.Request;import edu.itq.soa.mioperacion.Response;

/** * MiOperacionServiceSkeleton java skeleton for the axisService */public class MiOperacionServiceSkeleton {

/** * Auto generated method signature * * @param request * @return response */public Response miOperacionOperation(Request request) {

Response response = new Response();response.setCadena("Hola mundo!");return response;

}

}13. Se copia el archivo descriptor del servicio web services.xml que se generó en

src/main/resources a la carpeta src/main/wsdl

Despliegue del servicio web1. Ya que se tiene implementado el servicio web se procede a empaquetarlo para poderlo

desplegar. Esta operación SE TIENE QUE HACER CADA VEZ QUE SE EFECTÚE UN CAMBIO EN LA IMPLEMENTACIÓN DEL SERVICIO WEB. Para empaquetar la implementación del servicio web en su correspondiente archivo .arr (Axis2 archive) se ejecuta la tarea “package-server” desde la vista Ant.

2. Se obtiene un resultado exitoso como el que se muestra a continuación:

3. Se refresca el proyecto y se verá que en la raíz quedó generado el archivo .aar

4. Se copia el archivo .aar generado y se despliega copiándolo en la ruta de servicios del axis2, dentro del servidor web tomcat.

5. Se inicia el servidor tomcat con el clic derecho y opción “Start”:

6. Una vez levantado el servidor se tendrá una salida en la consola en la que se reporta el despliegue correcto del servicio web.

Feb 24, 2015 10:32:21 PM org.apache.catalina.core.AprLifecycleListener initINFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\opt\Java\jdk1.7.0_51\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/opt/Java/jre7/bin/client;C:/opt/Java/jre7/bin;C:/opt/Java/jre7/lib/i386;C:\Program Files (x86)\IBM\WebSphere MQ\java\lib;C:\Program Files (x86)\IBM\WebSphere MQ\java\lib64;C:\oraclexe\app\oracle\product\11.2.0\server\bin;;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;c:\Program Files (x86)\Intel\iCLS Client\;c:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Windows Live\Shared;C:\IBM\BPM\v8.0\db2\BIN;C:\IBM\BPM\v8.0\db2\FUNCTION;C:\IBM\BPM\v8.0\db2\SAMPLES\REPL;C:\Program Files\TortoiseSVN\bin;D:\opt\jboss-4.2.3.GA\bin;C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin;C:\opt\Java\jdk1.6.0_35\bin;D:\opt\gradle-1.9\bin;C:\Program Files\OpenVPN\bin;C:\Program Files (x86)\IBM\WebSphere MQ\bin64;C:\Program Files (x86)\IBM\WebSphere MQ\bin;D:\opt\apache-ant-1.8.0\bin;C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\;C:\Program Files (x86)\CVSNT\;C:\Program Files (x86)\SSH Communications Security\SSH Secure Shell;D:\opt\eclipse;;.Feb 24, 2015 10:32:21 PM org.apache.coyote.AbstractProtocol initINFO: Initializing ProtocolHandler ["http-bio-8080"]Feb 24, 2015 10:32:21 PM org.apache.coyote.AbstractProtocol initINFO: Initializing ProtocolHandler ["ajp-bio-8009"]Feb 24, 2015 10:32:21 PM org.apache.catalina.startup.Catalina loadINFO: Initialization processed in 366 msFeb 24, 2015 10:32:21 PM org.apache.catalina.core.StandardService startInternalINFO: Starting service CatalinaFeb 24, 2015 10:32:21 PM org.apache.catalina.core.StandardEngine startInternalINFO: Starting Servlet Engine: Apache Tomcat/7.0.19Feb 24, 2015 10:32:21 PM org.apache.catalina.startup.HostConfig deployWARINFO: Deploying web application archive axis2.war[INFO] Clustering has been disabled[INFO] Deploying module: addressing-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/addressing-1.6.2.mar[INFO] Deploying module: metadataExchange-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/mex-1.6.2.mar[INFO] Deploying module: mtompolicy-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/mtompolicy-1.6.2.mar[INFO] Deploying module: ping-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/ping-1.6.2.mar[INFO] Deploying module: script-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/scripting-1.6.2.mar

[INFO] Deploying module: soapmonitor-1.6.2 - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/modules/soapmonitor-1.6.2.mar[INFO] Deploying Web service: operacion.aar - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/services/operacion.aar[INFO] Deploying Web service: version.aar - file:/D:/opt/apache-tomcat-7.0.19/webapps/axis2/WEB-INF/services/version.aar[WARN] No transportReceiver for org.apache.axis2.transport.http.AxisServletListener found. An instance for HTTP will be configured automatically. Please update your axis2.xml file!Feb 24, 2015 10:32:23 PM org.apache.catalina.startup.HostConfig deployDirectoryINFO: Deploying web application directory docsFeb 24, 2015 10:32:23 PM org.apache.catalina.startup.HostConfig deployDirectoryINFO: Deploying web application directory examplesFeb 24, 2015 10:32:23 PM org.apache.catalina.core.ApplicationContext logINFO: ContextListener: contextInitialized()Feb 24, 2015 10:32:23 PM org.apache.catalina.core.ApplicationContext logINFO: SessionListener: contextInitialized()Feb 24, 2015 10:32:23 PM org.apache.catalina.core.ApplicationContext logINFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@1d90a5f')Feb 24, 2015 10:32:23 PM org.apache.catalina.startup.HostConfig deployDirectoryINFO: Deploying web application directory host-managerFeb 24, 2015 10:32:23 PM org.apache.catalina.startup.HostConfig deployDirectoryINFO: Deploying web application directory managerFeb 24, 2015 10:32:23 PM org.apache.catalina.startup.HostConfig deployDirectoryINFO: Deploying web application directory ROOTFeb 24, 2015 10:32:23 PM org.apache.coyote.AbstractProtocol startINFO: Starting ProtocolHandler ["http-bio-8080"]Feb 24, 2015 10:32:23 PM org.apache.coyote.AbstractProtocol startINFO: Starting ProtocolHandler ["ajp-bio-8009"]Feb 24, 2015 10:32:23 PM org.apache.catalina.startup.Catalina startINFO: Server startup in 1447 ms

Implementación del cliente del servicio web

Generación de clases para el cliente1. Se configuran el archivo build.properties para la generación del cliente, particularmente

los siguientes datos:

client.path=./clientclient.package=edu.itq.soa.mioperacion.client

2. Se ejecuta la tarea de ant generate-client

3. La consola debe mostrará la generación exitosa de las clases necesarias para el cliente web service:

Buildfile: D:\opt\ws\itq201501\MiServicio\build.xmlgenerate-client: [echo] Running WSDL2Java task [mkdir] Created dir: D:\opt\ws\itq201501\MiServicio\client [java] Retrieving document at './src/main/wsdl/operacion.wsdl'. [java] Retrieving schema at 'operacion.xsd', relative to 'file:/D:/opt/ws/itq201501/MiServicio/./src/main/wsdl/operacion.wsdl'. [java] log4j:WARN No appenders could be found for logger (org.apache.axis2.description.WSDL11ToAllAxisServicesBuilder). [java] log4j:WARN Please initialize the log4j system properly.BUILD SUCCESSFULTotal time: 2 seconds

4. Se refresca el proyecto para ver la carpeta client generada

5. Observamos que tenemos la carpeta client en la raíz del proyecto con la clase MiOperacionServiceStub.java generada:

Creación de prueba unitaria6. El cliente que se creará usando la clase generada será una prueba unitaria, por lo que

generaremos un nuevo source folder explícito para pruebas llamado src/main/test, para el cuál se da clic derecho en la raíz del proyecto y elegimos la opción “New/Source Folder”.

7. Asignamos el nombre src/main/test.

8. En el source folder creado vamos a crear una nueva prueba unitaria, para ello con clic derecho en él, se selecciona New/Other

9. Seleccionamos que queremos generar un nuevo JUnit Test Case

10. La prueba unitaria será con la versión 4, para hacer uso de anotaciones, por lo tanto seleccionamos esa opción y proporcionamos el nombre de la prueba unitaria, que por buena práctica le pondremos un nombre acorde a su funcionalidad y la palabra Test al final. Además también proporcionaremos el nombre del paquete, que por buena práctica también, se asignará el mismo paquete de la clase a probar.

11. Una vez finalizado el wizard de la prueba unitaria, aceptamos agregar la librería de junit 4 a nuestro proyecto.

12. La prueba unitaria se genera con el contenido más básico:

13. Para poder implementar la prueba unitaria necesitamos la clase del cliente generada que nos servirá para conectarnos al servicio web, para ellos copiamos la carpeta generada a partir de su paquete:

14. La pegamos en el source folder de la prueba unitaria.

15. La implementación consiste en crear una instancia de la clase stub, la cual recibirá un objeto con el nombre del request definido y responderá un objeto con el nombre del response definido en el archivo .wsdl. EL CONSTRUCTOR DE LA CLASE STUB POR DEFECTO APUNTA AL SERVICIO WEB CON LA URL DEFINIDA EN LA SECCION SERVICE DEL WSDL. SI SE REQUIERE OTRA URL SE DEBE PROPORCIONAR COMO PARÁMETRO DEL CONSTRUCTOR. EN ESTE EJEMPLO SE PREPARÓ EL WSDL PARA TENER LA RUTA QUE TENDRÁ EL SERVICIO UNA VEZ DESPLEGADO EN EL TOMCAT (http://localhost:8080/axis2/services/miOperacionService?wsdl).

/** * Prueba unitaria. */package edu.itq.soa.mioperacion.client;

import java.rmi.RemoteException;

import org.junit.Assert;import org.junit.Test;

import edu.itq.soa.mioperacion.client.MiOperacionServiceStub.Request;import edu.itq.soa.mioperacion.client.MiOperacionServiceStub.Response;

/** * @author tlopez */public class MiOperacionTest {

/** * Mensaje esperado del servicio web. */private static final String MENSAJE_ESPERADO = "Hola mundo!";

/** * Prueba unitaria para el servicio web expuesto "miOperacion". * Las anotaciones es ligar la funcionalidad de una clase a un

método, en este caso * la clase Test del framework de junit, debe anteponerse la @ al

nombre de la clase. * Si se quita la anotación el método DEJA de ser una prueba

unitaria. * @throws RemoteException */@Testpublic void miOperacionTest() throws RemoteException {

/* la clase Stub tiene la funcionalidad requerida para conectarse al servicio web.

En el constructor se debe proporcionar la URL del servicio si es que difiere de lo especificado

en la sección service del wsdl. Ejemplo: MiOperacionServiceStub miOperacionServiceStub = new

MiOperacionServiceStub("http://localhost:8080/axis2/services/miOperacionService?wsdl");

*/

MiOperacionServiceStub miOperacionServiceStub = new MiOperacionServiceStub();

/* Se debe crear el objeto que corresponda a la entrada de la operación definida en el wsdl, en este caso

coincide con el nombre Request. */Request request = new Request();

/* Se asignan todos los hijos del elemento, en este caso sólo se tiene el hijo cadena. */

request.setCadena("Cadena que se envia al servicio web");

/* La invocación del servicio web es invocar al método definido como operación en el wsdl. */

Response response = miOperacionServiceStub.miOperacionOperation(request);

/* El éxito de una prueba unitaria consiste en que se cumpla una aseveración, dicha aseveración se

plantea con base al conocimiento que se tiene por anticipado del comportamiento del método, como

existen varios tipo de aseveraciones, junit proporciona diverso métodos assert */

Assert.assertEquals(MENSAJE_ESPERADO, response.getCadena());}

}

16. Para ejecutar la prueba unitaria se da clic derecho y se elige “Run As/Junit Test” sobre el método a ejecutar o sobre la clase que contiene varias pruebas unitarias si se quisieran correr todas.

17. La ejecución exitosa del servicio web indicará que el assert se cumplió: