Ir al contenido principal

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.

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

Publicar un comentario

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de