Creación de servicios web interoperables en JAVA con Axis

Hay dos formas de desplegar un servicio web en Apache-Axis: Una instantánea y otra mediante descriptores de despliegue.

Despliegue instantáneo

Se puede desplegar un servicio web que tengamos codificado en un archivo java cambiando simplemente su extensión a .jws y copiándolo en el directorio raíz de la aplicación Axis dentro de Apache – Tomcat.

Axis detectará automáticamente los nuevos servicios creados de esta forma y los tendrá en cuenta para las futuras peticiones.

Sin embargo, a pesar de su sensillez, este método tiene un inconveniente: los servicios web que genera no pasan los tests del WS-I y, por lo tanto, no son interoperables.

Despliegue con descriptores de despliegue

A continuación mostramos los pasos par crear el servicio web y que sea interoperable.

  1. Partiremos en un principio de dos ficheros java: una interfaz (miInterfaz.java) y una clase que la implementa (miClase.java).
  2. Compilamos el código java con javac y la opcion –g para generar información de debug. Esta es la única forma de que Axis pueda obtener los nombres de los parámetros de los métodos. Si no compilamos con esa opción, Axis otorgará los nombres que quiera a los parámetros.
  3. A través del comando Java2WSDL, crearemos el fichero WSDL genérico que cumple con la interfaz dada. Tendremos que proporcionar los siguientes datos al comando Java2WSDL:
    • "-o" para indicar el nombre del WSDL de salida (miWSDL.wsdl).
    • "-l" sirve para indicar la URL del servicio web (http://localhost:8080/axis/services/miServicioWeb).
    • "-n" para indicar el namespace del servicio web (urn:miNamespace).
    • "-p" para indicar el mapeo "paquete java = namespace" ("miPaquete"=urn:miNamespace).
    • La interfaz descrita anteriormente (miPaquete.miInterfaz).
    • "-i" para indicar la clase que implementa la interfaz (miClase.java)
    • "-y" para indicar el estilo de binding en el WSDL (WRAPPED). Esto es fundamental para que el servicio generado sea interoperable. Las características del estilo WRAPPED son:
      • Es una forma del estilo document/literal, por lo que genera sólo se permite un "part" en el mensaje de entrada y otro en el de salida.
      • Cada "part" tiene que referenciar a un elemento (wrapper element) y no a un tipo.
      • Cada "wrapper element" tiene que estar definido como un "complex type" que es una secuencia de elementos, cada uno de los cuales se generará como un parámetro en la interfaz del servicio web.
      • El nombre del "wrapper element" de entrada es el mismo que el de la operación.
      • El nombre del "wrapper element" de salida debería ser el mismo que el de la operación concatenándole la cadena "Response".

    El comando quedaría aproximadamente de la siguiente forma:

    java org.apache.axis.wsdl.Java2WSDL -o miWSDL.wsdl -l"http://localhost:8080/axis/services/miServicioWeb" -n urn:miNamespace -p"miPaquete"=urn:miNamespace miPaquete.miInterfaz –i miClase.java -y WRAPPED
  4. Con WSDL2Java generamos el código del proxy (o stub) para el servidor y cliente. WSDL2Java recibirá los siguientes datos:
    • “-o” para indicar el directorio base de salida (.).
    • “-d” para indicar el ámbito de despliegue (Request, Session, Application).
    • “-s” para generar los “server-side” bindings del servicio.
    • “-p” para indicar el paquete donde colocar el código (miPaquete.ws).
    • Nombre del fichero WSDL (miWSDL.wsdl).

    El comando quedará aproximadamente de la siguiente forma:

    java org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -p miPaquete.ws miWSDL.wsdl
  5. En el directorio indicado se habrán generado los siguientes ficheros:

    Para el servidor:

    • miInterfazService.java
    • miInterfazSoapBindingImpl.java (Implementación de nuestro servicio web, posteriormente tendremos que modificar esta clase).
    • miInterfazSoapBindingSkeleton.java
    • deploy.wsdd (Descriptor de despliegue)
    • undeploy.wsdd (Descriptor para replegar el servicio).

    Para el cliente:

    • miInterfaz.java
    • miInterfazServiceLocator.java
    • miInterfazSoapBindingStub.java
  6. A continuación, modificaremos uno de los ficheros generados (MiInterfazSoapBindingImpl.java) para que sus métodos utilicen la implementación original de la que partíamos, ya que Axis nos genera una implementación por defecto.
  7. Compilamos el código del servicio web con javac.
  8. Empaquetamos el código y después lo copiamos al directorio "WEB-INF/lib" de Axis
    de la siguiente forma:

    jar cvf miServicioWeb.jar miPaquete/*.class miPaquete/ws/*.class
  9. Desplegamos el servicio web utilizando el archivo deploy.wsdd de la siguiente forma:
    java org.apache.axis.client.AdminClient deploy.wsdd

Son muchos pasos y muchos parámetros… ¿No hay una forma más fácil de hacerlo?

Este proceso es necesario en su totalidad para que el servicio web sea interoperable y pase todos los tests del WS-I. Para facilitarnos la vida podemos usar un fichero .bat. El fichero debería contener más o menos lo siguiente (a falta de modificar el valor de las variables por sus valores correctos en el caso de nuestro servicio).

@echo off
set WSDL=miWSDL.wsdl
set SERVICE_NAME=miServicioWeb
set URL=https://localhost:8080/axis/services
set MAIN_NAMESPACE=miNamespace
set PACKAGE=miPaquete.WebServices
set PACKAGE_DIR=miPaquete/WebServices
set INTERFACE=miInterfaz
set CLASE_IMPL=miClase
java -cp .;%AXISCLASSPATH% org.apache.axis.wsdl.Java2WSDL -o %WSDL% -l"%url%/%SERVICE_NAME%" -n urn:%MAIN_NAMESPACE%/%SERVICE_NAME% -p"%PACKAGE%"=urn:%MAIN_NAMESPACE%/%SERVICE_NAME% %PACKAGE%.%INTERFACE% -i %PACKAGE%.%CLASE_IMPL% -y WRAPPED
java -cp .;%AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -p %PACKAGE%.WS %WSDL%
echo ** Modifica el fichero %SERVICE_NAME%SoapBindingImpl.java
pause
javac -classpath .;%AXISCLASSPATH% %PACKAGE_DIR%/WS/*.java
jar cvf %SERVICE_NAME%.jar %PACKAGE_DIR%/*.class %PACKAGE_DIR%/WS/*.class
echo ** Copia el fichero %SERVICE_NAME%.jar en el directorio WEB-INF/lib de AXIS
pause
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient %PACKAGE_DIR%/WS/deploy.wsdd

Para que funcione, hay que crear las siguientes variables de entorno cambiando la ruta de instalación de Axis por la correcta:

AXIS_HOME = c:\axis
AXIS_LIB = %AXIS_HOME%\lib
AXISCLASSPATH = %AXIS_LIB%\activation.jar; %AXIS_LIB%\mail.jar; %AXIS_LIB%\axis.jar; %AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar; %AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar; %AXIS_LIB%\log4j-1.2.8.jar; %AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xerces.jar; %AXIS_LIB%\wsdl4j-1.5.1.jar; %AXIS_LIB%
Nuestra puntuación
Twittear
Compartir
Compartir
Pin