miércoles, 2 de noviembre de 2011

Creación de Servicio Web con Axis desde Eclipse

En muchas webs de la red encontramos como crear el servidor y el cliente de un servicio web (WS) mediante Axis o JAX-RPC mediante el API y la linea de comandos.

La mayoría de los IDEs de desarrollo (Eclipse, NetBean...) tienen plugins y asistentes para crear un WS desde 0 de una forma rápida y sencilla. En este post voy a mostrar un tutorial de cómo creo los WS desde Eclipse.

Los prerequisitos para seguir este tutorial será tener instalado una versión de Eclipse 3.X (el tutorial está realizado con la versión 3.3) con el plugin Web Standar Tools (WST).

 Lo primero que tendremos que hacer será crear un nuevo proyecto Web dinámico pulsando File > New > Project. Después pulsamos sobre Dynamic Web Project y  hacemos click sobre Next.





En la siguiente pantalla debemos introducir el nombre que queremos darle a nuestro proyecto, en nuestro caso, SumaWS y pulsar el botón Next.


A continuación elegimos los facets de nuestro proyecto web, que son como las versiones que queremos utilizar de los diferentes estandares que utilizamos en nuestro proyecto web. Nosotros elegiremos por ejemplo Java 1.5 y en Dynamic Web Module seleccionaremos la 2.4. Al finalizar pulsamos el botón Next.



Por último, seleccionamos nuestro context root (SumaWS), el directorio de contenido Web (WebContent) y el paquete de código fuente. Todo esto le sirve a Eclispe para hacer luego el empaquetado correctamente del WS.





Una vez que hemos creado el proyecto creamos nuestro WS. Se puede realizar con una clase Java, pero nosotros lo haremos con una clase Java que implementa una interfaz,  de forma que el código sea más elegante.

La clase de interfaz sería la siguiente:

package es.jpascu.calculadora;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IOperacionCalculadoraWS extends Remote {
 public double suma(double op1, double op2) throws RemoteException;

}

La clase de la implementación sería la siguiente:


package es.jpascu.calculadora;
import java.rmi.RemoteException;
public class OperacionCalculadoraWS implements IOperacionCalculadoraWS {
 public double suma(double op1, double op2) throws RemoteException {
  return op1 + op2;
 }
}

Como vemos, la interfaz debe heredar de RemoteException y todos los métodos del WS lanzan la excepción RemoteException.

La estructura del proyecto en Eclipse debería quedar como sigue:



Para crear nuestro WSDL deberemos hacer click con el  botón derecho sobre la clase de implementación y seleccionar la opción Web Services > Create Web Service:





Al hacer esto nos saldrá otro asistente en el que seleccionamos las opciones de nuestro WS, como la clase de implementación (ya aparece por defecto la que seleccionamos con el botón derecho) y dejamos el nivel de generación del servicio web a Assemble. También podemos elegir entre la implementación de Apache Axis 1 y 2. Nosotros lo dejamos por defecto (se selecciona la implementación de Axis 1.4). Al finalizar pulsamos el botón Next.




A continuación seleccionamos los métodos que queremos publicar en el WS de nuestro bean (en nuestro caso todos). También seleccionamos el estilo en el que podemos enviar la información de la petición XML de nuestro servicio. Este asistente nos deja seleccionar entre:


  • RPC. Es el tipo por defecto que utiliza Axis, y en él se emplean las convenciones definidas para mensajes SOAP RPC.
  • Document. No utiliza ningún tipo de codificación especial pero si que enlaza en la serialización los datos entre XML y Java.
  • Wrapped es parecido en su funcionamiento al estilo Document, pero cogiendo el cuerpo del mensaje SOAP y lo desmenuza en parámetros individuales. Seleccionaremos este.



Al pulsar Next, nos sale la siguiente pantalla y debemos pulsar el botón Finish.



 Una vez hecho esto, la estructura de nuestro proyecto debería ser la siguiente:




En primer lugar vemos que se ha añadido una librería de Eclipse con los JARs de AXIS. En segundo lugar se ha añadido unos archivos con extensión wsdd que contienen información que le sirve a Apache Axis para hacer un deploy/undeploy de nuestro servicio en el servidor de aplicaciones. En último lugar vemos que se ha creado un archivo wsdl que contiene toda la información de nuestro servicio en formato XML (nombre de las operaciones, parámetros de entrada y salida de todas las operaciones, etc).

Ya casi lo tenemos. Para que nuestro servicio web se despliegue automáticamente cuando hagamos el despliegue del WAR en nuestro servidor de aplicaciones, deberemos crear un archivo llamado server-config-wsdd dentro de la carpeta WEB-INF. Este archivo indicará al servidor de aplicaciones que clases definen un WS y como están configuradas. Además será donde se pueda integrar cualquier tipo de configuración y manejadores (handlers) para los WS. 

En el caso de nuestro WS tendría el siguiente contenido:





 
  
  
  
  
  
  
  
  
  
  
  
   
    
   
   
    
    
   
  
 
 
 
 
   

  
      
      
      
      
      
      
      
      
        
        
      
      

  
  
 
  
   
   
  
  
  
  
  
  
  
 
 
  
   

La parte que engloba la etiqueta service se extrae del archivo wsdd. Lo demás es fijo para todos los WS que hagamos. Si queremos desplegar más de un WS en un mismo WAR, debemos añadir más etiquetas service a nuestro descriptor server-config.wsdd.

Por último deberemos comprobar si en el proceso de creación de nuestro WS por el asistente se ha modificado el fichero web.xml  para añadir la definición y los mapeos del servlet de Axis. El fichero web.xml debería ser similar al siguiente:




 
 SumaWS
 
  
  Apache-Axis Servlet
  AxisServlet
  
  org.apache.axis.transport.http.AxisServlet
 
 
  
  Axis Admin Servlet
  AdminServlet
  
  org.apache.axis.transport.http.AdminServlet
  100
 
 
  AxisServlet
  /servlet/AxisServlet
 
 
  AxisServlet
  *.jws
 
 
  AxisServlet
  /services/*
 
 
  AdminServlet
  /servlet/AdminServlet
 
 
  index.html
  index.htm
  index.jsp
  default.html
  default.htm
  default.jsp
 

Nuestro archivo WSDL quedaría de la siguiente forma:


 
  
   
    
     
      
      
     
    
   
   
    
     
      
     
    
   
  
 

   

      

   

   

      

   

   

      

         

         

      

   

   

      

      

         

         

            

         

         

            

         

      

   

   

      

         

      

   






Para empaquetar nuestro proyecto Web de Eclipse en un WAR debemos hacer click con el botón derecho del ratón sobre nuestro proyecto y pulsar la opción Export:



Una vez en esta ventana seleccionamos la opción Web>WAR file y vamos a otra ventana en la que debemos introducir la ruta y el nombre de nuestro WAR.



Para finalizar pulsamos el botón Finish y nuestro artefacto estaría creado. Posteriormente podemos desplegarlo en cualquier servidor de aplicaciones como TomcatBea Weblogic o Jboss.

En otro post posterior explicaré como realizar un cliente de un servicio web rápidamente con Eclipse.

3 comentarios:

  1. Lo primero gracias por el ejemplo, los he probado y perfecto. Ahora estoy creando otro WS, en el que el cliente pasa un string. Creo que no genero correctamente el server-config.wsdd. ¿Alguna idea para generarlo automáticamente?

    ResponderEliminar
    Respuestas
    1. Hola! Estás usando eclipse? A mi se me generó automáticamente.
      Saludos, Hernán!

      Eliminar
  2. Hola! Ante todo, muchas gracias por el tutorial, es simple, conciso y muy funcional :)
    Lo que no estoy pudiendo es ingresar al método suma, podrías indicar cómo acceder?
    Yo por ahora sólo veo que el webservice funciona correctamente.
    Saludos, Hernán!

    ResponderEliminar