Crear una estructura compleja del tipo JavaBean en un servicio web Axis2
0. Índice de contenidos.
- 1. Introducción.
- 2. Entorno.
- 3. Instalación.
- 4. Crear el Servidor.
- 5. Configuración en SOAP UI.
- 6. Crear el Cliente.
- 7. Conclusiones.
1. Introducción
En este tutorial se pretende enseñar a crear otra de las estructuras complejas que se pueden implementar
en los servicios web : los tipos compuestos ( En Java serán los JavaBeans)
Por regla general en la programación no solo se limita al uso de los elementos que facilita el lenguaje,
sino que en muchos casos se permite la creación de elementos propios.
Un JavaBean es un componente Java que se utiliza para encapsular varios objetos en un único
objeto, por asi decirlo haría las veces de una estructura de registro de C, es decir, un tipo
que esta compuesto por otro tipos o por tipos simples.
Para que un objeto Java sea considerado un JavaBean requiere cumplir una serie de normas :
- Disponer de un contructor sin argumentos
- Sus atributos deberían de ser accesibles mediente métodos SET / GET
- Seguir las convenciones de nomenclatura estándar (nombre clase, nombres atributos, etc.)
- Implementar de serializable
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM,320 GB HD).
- Sistema operativo: Windows Vista Ultimate.
- Mozilla Firefox 2.0.0.20
- Apache Tomcat 7.0.0
- Axis2 1.5.1
- Soap UI 3.5
3. Instalacion.
Para la realización de este tutorial ser requiere :
1) Tener instalada servidor de aplicaciones Apache Tomcat (En mi caso uso la versión 7.0)
2) Tener la versión binaria de Axis2 (En mi caso uso la versión 1.5.1) descargada y descomprimida en un directorio
3) Tener la versión WAR de Axis2 (En mi caso uso la versión 1.5.1) desplegada en el Tomcat
4) Tener instalada la herramienta SOAP UI
Nota : Utilizaremos para su desarrollo la herramienta Eclipse
4. Crear el Servidor
PASO 1 : Crear un proyecto Java llamada Axis2JavaBeanWS
Se creará una estructura del proyecto como la siguiente
PASO 2 : Crear el paquete «com.acme.ws.servidor» sobre la carpeta src
PASO 3 : Crear una clase Java en el paquete anterior llamada Persona que será el JavaBean
Crear una clase con 3 atributos : nombre, apellidos y email.
package com.acme.ws.servidor; public class Persona { private String nombre; private String apellidos; private String email; public Persona() { super(); } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Nuestro proyecto quedaría asi :
PASO 4 : Crear una clase Java llamada BasicService en el paquete anterior
En este caso se definirán dos métodos que serán los servicios disponibles para los clientes.
En el método «login» se devolverá una cadena con los atributos de nombre y email indicando como
que se ha autenticado sin probemas.
En el método «loginEmail» se devolverá un JavaBean que se inicializará si y solamente si coincide el email
que se pasa como parámetro
package com.acme.ws.servidor; public class BasicService { public String login(Persona persona){ return "[Login] | Nombre "+persona.getNombre()+" | Email "+persona.getEmail(); } public Persona loginEmail (String email){ Persona result = null; if (email.toUpperCase().equals("ADMIN@ADMIN.COM")){ result = new Persona(); result.setNombre("Víctor"); result.setApellidos("Madrid Triviño"); result.setEmail("admin@admin.com"); } return result; } }
Nuestro proyecto quedaría asi :
PASO 5 : Crear la carpeta META-INF a nivel de la carpeta src
PASO 6 : Crear dentro de la carpeta META-INF el descriptor de servicio : services.xml
Introducimos el siguiente texto :
Servicio que hace uso de Java Bean com.acme.ws.servidor.BasicService
Nota : Recordar añadir la línea inicial : <?xml version=»1.0″ encoding=»UTF-8″?>
PASO 8 : Crear el fichero de ensamblado AAR (Axis ARchive)
Para ello exportar el proyecto como si fuera un JAR pero poniendo de nombre Axis2JavaBean.aar
Nota : No incluir .classpath ni .project
Arrancar Tomcat si esta parado
PASO 9 : Copiar el fichero AAR en <CATALINA_HOME>\webapps\axis2\WEB-INF\services
PASO 10 : Verificar en la consola de Tomcat la inclusión de este servicio
PASO 11 : Verificar el servicio desde la consola de administracion de Axis : http://localhost:8080/axis2/services/listServices
PASO 12 : Obtenemos el WSDL del servicio : http://localhost:8080/axis2/services/Axis2JavaBean?wsdl
Guardamos el fichero anterior que vendrá dado en formato XML por formato WSDL
5. Probar el servidor con SOAP UI
PASO 1 : Cargamos la herramienta
PASO 2 : Creamos un proyecto nuevo con la URL del WSDL anterior
PASO 3 : Realizamos un test sobre el método «loginEmail»
Para ello introducimos el siguiente email que será reconocido por el servidor :
<ser:email>admin@admin.com</ser:email>
PASO 4 : Ejecutamos el test y verificamos la respuesta
PASO 5 : Realizamos un test sobre el método «login»
PASO 6 : Ejecutamos el test y verificamos la respuesta
Con esto tendremos probado nuestro Servidor 😉
6. Crear el cliente
PASO 1 : Creamos un proyecto Java llamada Axis2JavaBeanWSCliente
Se generará una estructura similar a la siguiente
PASO 2 : Copiamos a nivel de raiz el fichero Axis2JavaBean.wsdl
PASO 3 : Generamos el Stub del cliente con la herramienta Axis2
Para ellos nos situamos por consola en el directorio del proyecto y ejecutamos la siguiente instrucción
- Si Axis2 NO esta en el Path : %AXIS2_HOME%\bin\wsdl2java -uri Axis2JavaBean.wsdl
- Si Axis2 esta en el Path : wsdl2java -uri Axis2JavaBean.wsdl
PASO 4 : Refrescamos el proyecto
Se habrán creado dos clases que nos permitirán comunicarnos con el servidor
PASO 5 : Incluir las librerías de Axis2
Con el botón derecho del ratón sobre el proyecto Properties -> Java Build Path , pestaña de
Libraries y pulsar sobre «Add Externar JARs»
PASO 6 : Crear un paquete «com.acme.ws.cliente»
PASO 7 : Crear una clase PruebaCliente.java
Esta clase dipondrá de dos métodos para realizar la llamada a los dos servicios
package com.acme.ws.cliente; import java.rmi.RemoteException; import com.acme.ws.servidor.Axis2JavaBeanStub; import com.acme.ws.servidor.Axis2JavaBeanStub.Persona; public class PruebaCliente { private static void login (){ /* * Utilizamos el stub generado a partir del wsdl que logran establecer * la conexion con el web service proveedor. */ Axis2JavaBeanStub customer = null; Axis2JavaBeanStub.Login request = null; Axis2JavaBeanStub.LoginResponse response = null; try { // creamos el soporte y la peticion customer = new Axis2JavaBeanStub(); request = new Axis2JavaBeanStub.Login(); // establecemos el parametro de la invocacion Persona p = new Persona(); p.setNombre("Víctor"); p.setApellidos("Madrid"); p.setEmail("admin@admin.com"); request.setPersona(p); // invocamos al web service response = customer.login(request); // mostramos la respuesta System.out.println(response.get_return()); } catch (RemoteException excepcionDeInvocacion) { System.err.println(excepcionDeInvocacion.toString()); } } private static void logout (){ /* * Utilizamos el stub generado a partir del wsdl que logran establecer * la conexion con el web service proveedor. */ Axis2JavaBeanStub customer = null; Axis2JavaBeanStub.LoginEmail request = null; Axis2JavaBeanStub.LoginEmailResponse response = null; try { // creamos el soporte y la peticion customer = new Axis2JavaBeanStub(); request = new Axis2JavaBeanStub.LoginEmail(); // establecemos el parametro de la invocacion request.setEmail("admin@admin.com"); // invocamos al web service response = customer.loginEmail(request); Persona p = response.get_return(); if (p != null){ System.out.println("[LoginEmail]"); System.out.println("Nombre : "+p.getNombre()); System.out.println("Apellidos : "+p.getApellidos()); System.out.println("Email : "+p.getEmail()); } else { System.out.println("La persona recuperada es nula"); } } catch (RemoteException excepcionDeInvocacion) { System.err.println(excepcionDeInvocacion.toString()); } } public static void main(String[] args) { login (); logout(); } }
PASO 8 : Ejecutar la clase
Con esto habriamos conseguido tener un servicio web en el que se utiliza la estructura
compleja del tipo JavaBean tanto de entrada como de salida.
7. Conclusiones.
Con estas pequeñas aportaciones espero estar ayudar a entender un poco mejor las estructuras
complejas en SOAP. En el caso de este tutorial se ha utilizado algo muy habitual cuando uno envía
una estructura propia usando SOAP .Se ha tratado de que el ejemplo sea lo más claro posible
para facilitar su entendimiento sin entrar en ningúna complejidad a la hora de crear los
servicios proporcionados.
Ya casi tenemos dominado esto de las comunicación SOAP 😉