You are on page 1of 7

Web Services con Axis : Mapeo de datos

Standard mappings from WSDL to Java

La especificacin JAX-RPC nos determina el mapeo entre tipos bsicos Java y los tipos SOAP implementados por Axis. El tipo mapeado se refleja en el fichero WSDL. Como este mapeo est definido por convencin, conseguimos la interoperabilidad, concepto fundamental de SOAP. No necesitamos saber cmo realmente se ha implementado el tipo definido que sigue las convenciones JAX-RPC. Los tipos propios se acaban descomponiendo en tipos bsicos. Es recomendable que los tipos propios sean estilo JavaBean. Axis proporciona serializadores/deserializadores por defecto para clases que siguen la convencin JavaBean (clases desacopladas con propiedades y mtodos de acceso get y set). En el fichero wsdd se puede indicar una clase propia para la serializacin y deserializacin

Aspectos a tener en cuenta: Datos sin signo: Como no hay tipos de datos sin signos con Java, Axis, de momento, no proporciona soporte para estos tipos. Por lo tanto, no podemos consumir o generar servicios que usen tipos de datos sin signo con Axis. La forma ms recomendable, para asegurar la interoperabilidad entre .Net y Java, para declarar una agrupacin de objetos, es usar arrays (no colecciones o tablas). WSDL <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ServicioSaluda"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <complexType name="Horario"> <sequence> <element name="horaentrada" nillable="true" type="xsd:dateTime" /> <element name="horasalida" nillable="true" type="xsd:dateTime" /> <element name="idhorario" nillable="true" type="xsd:long"/> <element name="nombre" nillable="true" type="xsd:string" /> <element name="retraso" nillable="true" type="xsd:dateTime" /> </sequence> </complexType> <complexType name="Grupo"> <sequence> <element name="horario" nillable="true" type="tns2:Horario"/> <element name="idgrupo" nillable="true" type="xsd:long" /> <element name="nombre" nillable="true" type="xsd:string" /> </sequence> </complexType> </schema> Interfaz de Contrato del Servicio public interface Saluda{ public String dimeHola(String message) ; public String dimeHola(Horario horario); public Grupo[] findByHorario(Horario dto); }

WSDL <wsdl:message name="dimeHolaResponse"> <wsdl:part name="dimeHolaReturn" type="xsd:string" /> </wsdl:message> <wsdl:message name="dimeHolaRequest"> <wsdl:part name="in0" type="tns2:Horario" /> </wsdl:message> <wsdl:portType name="Saluda"> <wsdl:operation name="dimeHola" parameterOrder="in0"> <wsdl:input name="dimeHolaRequest" message="impl:dimeHolaRequest" /> <wsdl:output name="dimeHolaResponse" message="impl:dimeHolaResponse" /> </wsdl:operation> </wsdl:portType> Pasos construccin de WebService: 1. Creacin de la clase Interfaz de contrato (implica codificacin) 2. Generacin del fichero WSDL (Ejecucin de tarea Ant) 3. Generacin de las clases esqueleto servidor (Ejecucin de tarea Ant) 4. Implementacin del contrato (implica codificacin) 5. Generacin de las clases esqueleto para el consumo cliente (Ejecucin de tarea Ant) Paso 1: Creacin de la clase Interfaz de contrato. public interface Saluda{ public String dimeHola(String message) ; public String dimeHola(Horario horario); public Grupo[] findByHorario(Horario dto); } Recordar que la finalidad de los Web Services es proporcionar una funcionalidad muy concreta y especfica. Se tratar de lgica de negocio principalmente. Dicha funcionalidad debe estar muy bien definida: Interfaz de Contrato y los tipos propios (JavaBeans) deben ser DTOs.

Because these JavaBeans are used to transfer data to and from the service, they are sometimes termed Data Transfer Objects (DTOs).
Debemos evitar que los DTOs hagan operaciones dentro, ya que los DTOs deben ser reemplazados por las clases que nos proporciona Axis del modelo, ya que implementan la serializacin y deserializacin. Slo deben ser clases con mtodos gets y sets. Cualquier otra transformacin de datos, realizarla desde otra clase de apoyo.

Paso 2: Generacin del fichero WSDL. build.xml <target name="1.Java2WDSL" depends="prepare,compileServer> <Java2WsdlAntTask output="${basedir}/config/wsdl/${service.name}.wsdl" location="http://${server.ip}:${server.port}/$ {webapp.name}/services/ ${service.name}" namespace="http://AME-CursoAxis/" classname="com.endesa.curso.ws.interfaz.${service.name}"> <mapping package="com.endesa.curso.ws.modelo" namespace="urn:Servicio${service.name}" /> <mapping package="com.endesa.curso.ws.interfaz" namespace="http://AME-CursoAxis/" /> <classpath refid="Java2WSDL.classpath /> </Java2WsdlAntTask> </target> A partir de la Interfaz de contrato nos genera el fichero WSDL. Paso 3: Generacin clases esqueleto servidor. <target name="2.WSDL2JavaServer" depends="1.Java2WDSL"> <Wsdl2javaAntTask url="${basedir}/config/wsdl/${service.name}.wsdl" output="${basedir}/JavaSource" serverside="yes" testcase="no" verbose="true" skeletondeploy="true"> <mapping namespace="urn:Servicio${service.name}" package="com.endesa.curso.ws.modelo" /> <mapping namespace="http://AME-CursoAxis/" package="com.endesa.curso.ws.skeleton.interfaz" /> </Wsdl2javaAntTask> </target>

Nos ha generado los ficheros de despliegue y repliegue WSDD. Nos ha construido las clases: SDI, Stub, Servicio, Localizador de Servicio, Metadata, Holder, BindingSkeleton, BindingImpl. Si ya exista la clase BindingImpl no la sustituye. No tenemos que preocuparnos de nada. Slo codificar el cuerpo de los mtodos de la clase BindingImpl.

Paso 4: Implementacin del contrato. package com.endesa.curso.ws.skeleton.interfaz; import com.endesa.curso.ws.modelo.Horario; import com.endesa.curso.ws.modelo.Grupo; public class SaludaSoapBindingImpl implements com.endesa.curso.ws.skeleton.interfaz.Saluda{ public java.lang.String dimeHola( com.endesa.curso.ws.modelo.Horario in0) throws java.rmi.RemoteException { return null; } public java.lang.String dimeHola(java.lang.String in0) throws java.rmi.RemoteException { return null; } public com.endesa.curso.ws.modelo.Grupo[] findByHorario(com.endesa.curso.ws.modelo.Horario in0) throws java.rmi.RemoteException { return null; } } Clase de propuesta de implementacin vaca. Paso 5: Generacin clases esqueleto para consumo cliente. build.xml <target name="WSDL2JavaClient" depends="prepare"> <Wsdl2javaAntTask url="${basedir}/config/wsdl/${service.name}.wsdl" output="${build.src.dir}" serverside="no" testcase="no" verbose="true"> <mapping namespace="urn:Servicio${service.name}" package="com.endesa.curso.ws.modelo" /> <mapping namespace="http://AME-CursoAxis/" package="com.endesa.curso.ws.interfaz" /> </Wsdl2javaAntTask> </target> <target name="4.createWebServiceClientSkeleton" depends="WSDL2JavaClient,compileClient"> <jar destfile="${dist.dir}/${webapp.name}_${service.name}_cliente.jar" basedir="${build.classes.dir}"> <include name="com/endesa/curso/ws/modelo/**" /> <include name="com/endesa/curso/ws/interfaz/**" /> </jar> <copy todir="${cliente1.lib.dir}"> <fileset dir="${dist.dir} includes=" ${ webapp.name } _ ${ service.name } _cliente.jar " /> </copy> </target>

Nos ha construido las clases: SDI, Stub, Servicio, Localizador de Servicio, Metadata, Holder. (Por si queremos utilizarlas en el cliente) Las genera a partir del WSDL. No necesita nada ms. Ese WSDL puede proporcionarnoslo cualquier equipo o sistema. Opciones de consumo WS Axis nos ayuda al consumo de Web Services, proporcionndonos localizadores de servicio y serializadores para los tipos de datos propio. Todo mediante tareas Ant. Tambin podemos consumirlo utilizando los objetos JAX-RPC genricos: Call y Service. Veremos las dos formas de consumo.

Opcin 1: Consumo con clases esqueleto obtenidas con el paso 5 de la construccin. SaludaServiceLocator locator=new SaludaServiceLocator(); Saluda sdi=locator.getSaluda(); String ret=sdi.dimeHola("Hay Alguien?"); - Las clases generadas con el WSDL2Java, contienen a fuego la URL de localizacin de servicio. Tambin los nombres de espacio que corresponden con cada tipo y servicio del fichero WSDL. - El localizador de servicio nos proporciona otro mtodo para obtener el servicio a partir de otra URL que nos proporcione la descripcin de servicio (el fichero WSDL). SaludaServiceLocator locator=new SaludaServiceLocator(); Horario horario=new Horario(); horario.setNombre("Solo de Maana"); Grupo []grupos=locator.getSaluda().findByHorario(horario); Opcin 2: Consumo con objetos JAX-RPC genricos: Call y Service. Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new java.net.URL(WS_END_POINT) ); call.setOperationName( new QName("ServicioSaluda", "dimeHola")); call.addParameter( "in0", XMLType.XSD_STRING, ParameterMode.IN ); call.setReturnType( XMLType.XSD_STRING ); String ret = (String) call.invoke( new Object [] { "Te saludo"});

(Con tipos propios) Service service = new Service(); Call call = (Call) service.createCall(); QName qn = new QName( "urn:ServicioSaluda", "Horario" ); call.registerTypeMapping( Horario.class, qn, new org.apache.axis.encoding.ser.BeanSerializerFactory( Horario.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory( Horario.class,qn)); call.setTargetEndpointAddress( new java.net.URL(WS_END_POINT) ); call.setOperationName( new QName("ServicioSaluda", "dimeHola")); call.addParameter( "in0", qn, ParameterMode.IN ); call.setReturnType( XMLType.XSD_STRING ); Horario horario=new Horario(); horario.setNombre("Solo de Maana"); String ret = (String) call.invoke( new Object [] { horario}); Restricciones y limitaciones Recordar que la finalidad de los Web Services es proporcionar una funcionalidad muy concreta y especfica. Se tratar de lgica de negocio principalmente. Para realizar transacciones no pueden compararse en su grado de desarrollo con los estndares abiertos de computacin distribuida como CORBA. Su rendimiento es bajo si se compara con otros modelos de computacin distribuida, tales como RMI, CORBA, o DCOM. Es uno de los inconvenientes derivados de adoptar un formato basado en texto. Y es que entre los objetivos de XML no se encuentra la concisin ni la eficacia de procesamiento. Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en firewall cuyas reglas tratan de bloquear o auditar la comunicacin entre programas a ambos lados de la barrera.

You might also like