Hola de nuevo a todos. Proseguimos con la serie de tutoriales sobre Web Services, y en esta ocasión veremos como crear un web service con JAXWS a partir de un POJO. En nuestro ejemplo haremos un WS que simulará una aplicación de servicio meteorológico. Permitirá consultar la previsión del tiempo de una ciudad para los próximos cinco días, así como el tiempo para una fecha en concreto. Omitiremos la parte de consulta a base de datos, para centrarnos en la parte que nos interesa, que es el propio web service. Para el desarrollo de nuestro WS utilizaremos Eclipse y la versión 2.1.2 de JAXWS.
Los pasos que realizaremos para crear el WS serán:
- Creación de la clase java
- Ejecución del wsgen
- Modificación del fichero web.xml
- Creación del fichero sun-jaxws.xml
- Creación del fichero de despliegue de la aplicación (war)
Instalación de JAXWS
El primer paso para crear nuestro WS es instalar JAXWS. Podéis ver los pasos a seguir en uno de nuestros anteriores tutoriales.
Creación del POJO
Como ya hemos mencionado anteriormente, para este tutorial vamos a simular una aplicación que ofrece información metereológica. Creamos un “dinamic web project” en eclipse, y creamos las clases que componen nuestra aplicación:
ParteMetereologico.java
package ejemplo;
import java.util.Calendar;import java.util.Date;import java.util.Vector;
import javax.jws.WebService;
@WebServicepublic
class ParteMetereologico {
public Prevision getPrevisionFecha(String ciudad, Date fecha) {
// Aquí consultaríamos en la base de datos la previsión para ese día y ciudad
// Devolvemos unos datos de ejemplo
Prevision prevision = new Prevision(ciudad, fecha, 10, "Lluvioso");
return prevision;
}
public Vector getPrevision(String ciudad) {
// Aquí consultaríamos en la base de datos la previsión para esa ciudad
Vector previsiones = new Vector();
// Devolvemos unos datos de ejemplo para los próximos 5 días
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
previsiones.add(new Prevision(ciudad, calendar.getTime(), 10, "Lluvioso"));
calendar.add(Calendar.DATE, 1);
previsiones.add(new Prevision(ciudad, calendar.getTime(), 9, "Nubes y claros"));
calendar.add(Calendar.DATE, 1);
previsiones.add(new Prevision(ciudad, calendar.getTime(), 8, "Lluvioso"));
calendar.add(Calendar.DATE, 1);
previsiones.add(new Prevision(ciudad, calendar.getTime(), 10, "Nublado"));
calendar.add(Calendar.DATE, 1);
previsiones.add(new Prevision(ciudad, calendar.getTime(), 15, "Soleado"));
return previsiones;
}
}
Prevision.java
package ejemplo;
import java.util.Date;
public class Prevision {
String Ciudad = null;
Date fecha = null;
int temperatura = 0;
String estado = null;
public Prevision() {
super();
}
public Prevision(String ciudad, Date fecha, int temperatura, String estado) {
super();
Ciudad = ciudad;
this.fecha = fecha;
this.temperatura = temperatura;
this.estado = estado;
}
public String getCiudad() {
return Ciudad;
}
public String getEstado() {
return estado;
}
public Date getFecha() {
return fecha;
}
public int getTemperatura() {
return temperatura;
}
public void setCiudad(String ciudad) {
Ciudad = ciudad;
}
public void setEstado(String estado) {
this.estado = estado;
}
public void setFecha(Date fecha) {
this.fecha = fecha;
}
public void setTemperatura(int temperatura) {
this.temperatura = temperatura;
}
}
La clase ParteMetereologico implementa dos métodos que serán accesibles a través del WS. GetPrevision devuelve la prevision para los próximos cinco días de una ciudad dada, mientras que GetPrevisionFecha devuelve la previsión para una ciudad y una fecha en concreto. Mediante la anotación @WebService le indicamos a JAXWS cual es la clase que implementará el WS.
Una vez creadas las clases, veremos que el proyecto tiene errores. Esto se debe a que tenemos que incorporar las liberías de JAXWS al proyecto. Aquí caben varias posibilidades. Si el servidor de aplicaciones que vayáis a utilizar tiene las librerías de jaxws (los jar que tenemos que incorporar son los que se encuentran en la carpeta lib, dentro del directorio en el que hayamos instalado JAXWS), ya instaladas, os bastará con lo siguiente:
- Pinchamos con el botón derecho del ratón sobre nuestro proyecto, y seleccionamos “Build Path” – “Configure Build Path…”. Si vamos a crear varios WS, es una buena idea meter las librerías de JAXWS en una librería de usuario. De esta forma cada vez que lo vayamos a incorporar a un proyecto no tendremos que seleccionar todos los jar, si no que seleccionaremos la librería de usuario. Para crear una librería de usuario nos vamos al menú “Window” – “Preferences…” – “Java” – “Build Path” – “User Libraries” – “New”. Ahí le pondríamos un nombre y seleccionamos los jar que queremos incluir. Posteriormente sólo tendríamos que añadir la librería de usuario que hayamos creado al proyecto.
- En caso de que el servidor de aplicaciones no tenga las librerías, copiarlas en la carpeta “/WEB-INF/lib” de vuestro proyecto. De esta manera, cuando lo exportéis en el war, Eclipse incluirá los jar de jaxws.
Compilamos el proyecto para que se generen los “.class”.
Ejecución del wsgen
Una vez que tenemos nuestras clases creadas sin errores, utilizaremos la aplicación wsgen que viene con JAXWS para crear el WS. Para que nos sea más cómodo escribir las rutas en las que se crearán los ficheros, conviene meter en el PATH del equipo la ruta en la que se encuentra el wsgen (dentro de “bin”, en el directorio donde hayamos instalado el JAXWS).
Nos situamos en el directorio en el que eclipse haya generado los ficheros compilados (en nuestro caso en el directorio “build/classes” dentro del proyecto), y desde ahí lanzamos el ejecutable “wsgen”. La llamada con los parámetros queda de la siguiente manera:
wsgen -cp . -d . -verbose -r ../../WebContent/WEB-INF/wsdl -wsdl ejemplo.ParteMetereologico
-cp: Indica el classpath, es decir, donde tendrá que buscar los .class que hayamos generado.
-d: Indica el directorio donde queremos que genere las clases.
-verbose: Indica que nos vaya informando de las operaciones que va realizando.
-r: Indica la ruta donde queremos que nos guarde los ficheros de recursos (wsdl y demás).
-wsdl: Indica que queremos que nos genere el wsdl del WS.
Y por último tenemos la clase que implementará el WS.
Si necesitáis conocer todos los parámetros que admite el wsgen, ejecutarlo con el parámetro -help y aparecera un listado completo:
Si todo ha ido bien, tras la ejecución del wsgen deberíamos tener los siguientes nuevos ficheros:
- En el directorio build/classes/ejemplo/jaxws:
- GetPrevision.class
- GetPrevisionFecha.class
- GetPrevisionFechaResponse.class
- GetPrevisionResponse.class
- En el directorio WebContent/WEB-INF/wsdl:
- ParteMetereologicoService.wsdl
- ParteMetereologicoService_schema1.xsd
Modificación del web.xml
Una vez que tenemos todas las clases generadas, tenemos que indicar en el web.xml la clase que se encargará de atender las peticiones que lleguen al web service. Lo que se desplegará es un servlet que recogerá las peticiones que lleguen al web service. Incluímos las siguientes líneas en el fichero:
<listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <description>Parte Metereologico</description> <display-name>parteMetereologico</display-name> <servlet-name>parteMetereologico</servlet-name> <servlet-class> com.sun.xml.ws.transport.http.servlet.WSServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>parteMetereologico</servlet-name> <url-pattern>/metereologia</url-pattern> </servlet-mapping>
Estamos definiendo la clase que implementará el servlet que es “com.sun.xml.ws.transport.http.servlet.WSServlet”. También indicamos el listener del servlet: “com.sun.xml.ws.transport.http.servlet.WSServletContextListener”.
Creación del fichero sun-jaxws.xml
Para que el ws se despliegue tenemos que crear éste fichero. Irá en el mismo directorio que el web.xml, es decir en WEB-INF. El contenido del fichero de nuestro ejemplo es el siguiente:
<?xml version="1.0" encoding="UTF-8"?> <endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'> <endpoint name='meteorologia' implementation='ejemplo.ParteMeteorologico' url-pattern='/meteorologia' /> </endpoints>
De esta forma le estamos diciendo a JAXWS cual es la clase q implementa los métodos del WS.
Creación del fichero de despliegue (war)
Por fin llegamos al final de nuestro tutorial. Si hemos hecho todo corréctamente, lo único que nos queda es crear el fichero de despligue. En eclipse pinchando con el botón derecho del ratón sobre nuestro proyecto, le damos a “Export” y seleccionamos War file. Seleccionamos la ruta, y ya tenemos creado nuestro war. Lo único q quedaría es desplegarlo en el servidor de aplicaciones que estemos utilizando.
Si abris el war (con el winrar por ejemplo) deberíais tener la siguiente estructura de ficheros:
- META-INF
- MANIFEST.MF
- WEB-INF
- wsdl
- ParteMeteorologicoService.wsdl
- ParteMeteorologicoService_schema1.xsd
- lib
- activation.jar
- FastInfoset.jar
- http.jar
- jaxb-api.jar
- jaxb-impl.jar
- jaxb-xjc.jar
- jaxws-api.jar
- jaxws-rt.jar
- jaxws-tools.jar
- jsr173_api.jar
- jsr181-api.jar
- jsr250-api.jar
- resolver.jar
- saaj-api.jar
- saaj-impl.jar
- sjsxp.jar
- stax-ex.jar
- streambuffer.jar
- classes
- ejemplo
- jaxws
- GetPrevision.class
- GetPrevisionFecha.class
- GetPrevisionFechaResponse.class
- GetPrevisionResponse.class
- Prevision.class
- ParteMeteorologico.class
- jaxws
- ejemplo
- web.xml
- sun-jaxws.xml
- wsdl
Si accedéis a la siguiente ruta:
http://host:puerto/nombre_war/meteorologia?wsdl
podréis ver el wsdl del WS. Host es la máquina de vuestro servidor de aplicaciones, puerto es el puerto en el que esté corriendo y nombre_war es el nombre que le hayáis dado al exportar el fichero.
Espero que os haya servido de algo de ayuda el tutorial, y nos vemos en el próximo, en el que veremos como hacer un cliente para el WS que acabamos de crear.


Comentarios
Dejar un comentario Trackback