Crear Web Service desde cero con JAX-WS

Crear WebServices con JAX-WS

desde cero

 

Los pasos que realizaremos para crear el WebService sin asistentes serán:

  • Creación de la clase java
  • Ejecución del wsgen
  • Creació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

Primero instalamos correctamente el JAXWS y configurar las variables de entorno.

Podemos descargarlo en el siguiente enlace:

Descargar JAXWS

En la página de descarga nos incluyen información para instalarlo. Una vez descargado el jar, en una ventana de comandos, ejecutaremos el siguiente comando:

java -jar JAXWS2.nuestraversion.jar

Aparecerá un acuerdo de licencia, y tras bajar al final del mismo, se activará el botón de aceptar. En la carpeta en la que nos encontremos, se descomprimirá el jar, y obtendremos los siguientes directorios:

  • jaxws-ri ( Directorios principal)
    • bin (Directorio con los ejecutables que nos servirán para generar los web services)
    • docs (Documentación)
    • lib (Librerías que utiliza el API)
    • samples (Ejemplos)

La clase Configuraciones implementa dos métodos que serán accesibles a través del WebServices con el método getvar () devuelve la propiedad que hemos leído del fichero, mientras que getProperties () devuelve la propiedad cambiada en el archivo. Mediante la anotación @WebService le indicamos a JAXWS cuál es la clase que implementará el WebService.

Una vez creada la clase y montado en eclipse, 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 WebService. 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

Parámetros de wsgen

  • El nombre de la clase_implementación_servicio es el único parámetro necesario. Los siguientes parámetros son opcionales para el mandato wsgen:
  • -classpath <vía_acceso>

    Especifica la ubicación de la clase de implementación de servicio.

  • -cp <vía_acceso>

    Es igual que -classpath <vía_acceso>.

  • -d <directorio>

    Especifica dónde se han de colocar los archivos de salida generados.

  • -extension

    Especifica si se permiten extensiones personalizadas para las funciones que no están especificadas en la especificación JAX-WS. Si se utilizan extensiones, es posible que las aplicaciones no se puedan portar o no puedan interactuar con otras implementaciones.

  • -help

    Muestra el menú de ayuda.

  • -keep

    Especifica si se conservan los archivos de origen generados.

  • -r <directorio>

    Este parámetro sólo se utiliza junto con el parámetro -wsdl. Especifica dónde se ha de colocar el archivo WSDL generado.

  • -s <directorio>

    Especifica el directorio dónde se han de colocar los archivos fuente generados.

  • -verbose

    Especifica que se han de generar mensajes de salida relacionados con las acciones del compilador.

  • -version

    Imprime la información de versión. Si especifica esta opción, sólo se generará la salida de la información de versión y no se llevará a cabo el proceso normal de mandatos.

  • -wsdl [:protocolo]

    Por omisión, wsgen no genera un archivo WSDL. Este parámetro opcional hace que wsgen genere un archivo WSDL y generalmente sólo se utiliza para que un desarrollador revise un archivo WSDL antes de que se despliegue el punto final. La opción protocolo es opcional y especifica el protocolo que se utiliza en wsdl: binding. Los valores válidos para protocol son soap 1.1 y Xsoap 1.2. El valor por omisión es soap 1.1. El valor Xsoap 1.2 no es estándar y sólo se puede utilizar junto con la opción -extension.

  • -servicename <nombre>

    Este parámetro sólo se utiliza junto con la opción -wsdl. Especifica un nombre wsdl:service que se ha de generar en el archivo WSDL. Por ejemplo:

    -servicename “{http://mynamespace/} MyService”

  • -portname

    Este parámetro sólo se utiliza junto con la opción -wsdl. Especifica un nombre wsdl: port que se ha de generar en el archivo WSDL. Por ejemplo:

    -portname “{http://mynamespace/} MyPort”

  • -servicename <nombre>
    • Este parámetro sólo se utiliza junto con la opción -wsdl. Especifica un nombre wsdl:service que se ha de generar en el archivo WSDL. Por ejemplo:

Si detrás de la opción ponemos. Se refiere a que estamos en el directorio por ejemplo en la opción –r. Nos referimos a la ruta en la que estamos.

Nosotros Utilizaremos esta línea de comandos.

Nos situamos donde tenemos nuestra clase compilada.

wsgen -cp . -d . -verbose -r C:\JAXWS\pruebaWebservices\WEB-INF\wsdl -wsdl dispositivos.Configuraciones

La salida de esta acción en archivos es la siguiente:

wsdl

  • ConfiguracionesService.wsdl
  • ConfiguracionesService_schema1.xsd

Y en la ruta que estamos “buil/classes

Generara el siguiente paquete con las siguientes clases:

Paquete
jaxws

Clases:

  • ExceptionBean.class
  • ExceptionBean.java
  • GetProperties.class
  • GetPropertiesResponse.class
  • GetProperty.class
  • GetPropertyResponse.class
  • Getvar.class
  • GetvarResponse.class

Ya tenemos las classes para el WebService ahora solo nos faltan crear los dos XML.

web.xml y sun-jaxws.xml

El web.xml tendrá lo siguiente:

<web-app
xmlns=http://java.sun.com/xml/ns/j2ee&#8221;
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation=http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&#8221;
version=“2.4”>

 <listener>

 <listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>Configuracioens</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Configuracioens</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>

En el sun-jaxws.xml tendremos lo siguiente:

<?xml version=“1.0” encoding=“UTF-8”?>
<endpoints
xmlns=http://java.sun.com/xml/ns/jax-ws/ri/runtime&#8217;
version=‘2.0’>
<endpoint name=‘test’
implementation=‘dispositivos.Configuraciones’
url-pattern=‘/test’
/>
</endpoints>

Ahora nos creamos un proyecto web dinámico y metemos todo el contenido en su sitio

Hay que meter en el lib todas las librerías de jaxws.

Quedaría de la siguiente manera:

Ahora generamos nuestro War con eclipse y lo metemos en la carpeta de webapps de nuestro Tomcat y lo desplegamos desde la consola para ver que no tiene errores:

Ahora comprobamos que tenemos bien desplegado el war desde el navegador:

http://localhost:8080/despliegue/test?wsdl

Si está bien nos pintara el xml.

Podemos también testear desde

http://localhost:8080/despliegue/test

Bien pues ya tenemos el WebServices creado y desplegado.

Ahora vamos a crearnos un cliente

Mandato wsimport para aplicaciones JAX-WS

La herramienta de línea de mandatos wsimport procesa un archivo WSDL (Web Services Descripción Language) y genera los artefactos necesarios que se pueden portar para desarrollar aplicaciones de servicio Web JAX-WS (Java API for XML-Based Web Services).

La herramienta de línea de mandatos wsimport da soporte al método en sentido descendente para desarrollar servicios Web JAX-WS. Cuando comience con un archivo WSDL existente, utilice la herramienta de línea de mandatos wsimport para generar los artefactos JAX-WS portables necesarios.

La herramienta wsimport lee un archivo WSDL existente y genera los artefactos portables siguientes:

  • SEI (Service Endpoint Interface): SEI es la representación Java anotada del archivo WSDL para el servicio Web. Esta interfaz se utiliza para implementar puntos finales JavaBeans o para crear instancias de cliente proxy dinámico.
  • Clase de extensión javax.xml.ws.Service: esta es una clase generada que amplía la clase javax.xml.ws.Service. Esta clase se utiliza para configurar y crear tanto instancias de proxy dinámico como instancias de asignación.
  • beans de datos necesarios, incluidos los beans JAXB (Java Architecture for XML Binding) necesarios para diseñar los datos del servicio Web.

Puede empaquetar los artefactos generados en un archivo WAR (Web Archive) con el archivo WSDL y los documentos de esquema junto con la implementación de punto final que se ha de desplegar.

Configuraciones soportadas: Para utilizar correctamente la herramienta wsimport, debe cumplir con los requisitos siguientes:

  • Debe definir todos los servicios dentro del archivo WSDL principal. La herramienta wsimport no procesa los servicios definidos dentro de un archivo WSDL importado.
  • Si ejecuta la herramienta wsimport en un archivo WSDL que implementa un patrón de tipo Literal o Documento, los elementos complexTypes que definen los tipos de entrada y de salida deben constar de nombres de parámetros exclusivos para impedir conflictos de nombres en la lista de parámetros de la operación cuando se utiliza portType.
  • Si ejecuta la herramienta wsimport y pasa un URL (Uniform Resource Identifier) ?wsdl como un parámetro para un archivo WSDL, asegúrese de que está utilizando el URI de WSDL resuelto. La herramienta wsimport resuelve correctamente el URI ?wsdl, pero es posible que los otros URI relativos a los que se hace referencia no se resuelvan correctamente.
  • Si pasa un archivo de enlace JAXB a la herramienta wsimport, el archivo de enlace JAXB debe ser válido. Si el archivo de enlace JAXB no se crea correctamente, la herramienta wsimport se ejecuta pero ignora los errores que puedan encontrarse en el archivo de enlace. Dado que la herramienta wsimport no captura ni genera informe acerca de estos errores, es posible que no tenga información sobre estos errores hasta que descubra que las personalizaciones de JAXB no han entrado en vigor en su aplicación. Para determinar si tiene un archivo de enlace JAXB creado correctamente, ejecute la herramienta xjc en su archivo WSDL o en su documento de esquema y en su archivo de enlace personalizado. La herramienta xjc informa acerca de los errores encontrados en el archivo de enlace personalizado. Para obtener más información acerca de la herramienta xjc, consulte la documentación acerca de cómo utilizar las herramientas JAXB para generar clases JAXB a partir de un archivo de esquema XML.

Sintaxis

La sintaxis de la línea de mandatos es:

http://192.168.1.62:8080/despliegue/test?wsdl

raíz_servidor_aplic
/bin wsimport [options] URI_WSDL 

Parámetros

  • El URI_WSDL es el único parámetro necesario. Los siguientes parámetros son opcionales para el mandato wsimport:
  • -d <directorio>

    Especifica dónde se han de colocar los archivos de salida generados.

  • -b <vía acceso>

    Especifica los archivos JAX-WS o JAXB de enlace externos. Puede especificar varios archivos de enlace JAX-WS y JAXB mediante la opción -b. No obstante, cada archivo se debe especificar con su propia opción -b.

  • -catalog

    Especifica el archivo de catálogo para resolver las referencias de entidad externas. Da soporte a los formatos de catálogos XML TR9401, XCatalog y OASIS.

  • -extension

    Especifica si se aceptan las extensiones personalizadas para las funciones que no se han especificado mediante la especificación JAX-WS. Si se utilizan extensiones personalizadas, es posible que las aplicaciones no se puedan portar o no puedan interactuar con otras implementaciones.

  • -help

    Muestra el menú de ayuda.

  • -httpproxy:<host>:<puerto>

    Especifica un proxy HTTP. El valor de puerto por omisión es 8080.

  • -keep

    Especifica si se conservan los archivos de origen generados.

  • -p

    Especifica un paquete de destino con esta opción de línea de mandatos y altera temporalmente cualquier personalización de archivo WSDL y enlace de esquema para el nombre del paquete y el algoritmo de nombre de paquete por omisión definidos en la especificación JAX-WS.

  • -s <directorio>

    Especifica el directorio dónde se han de colocar los archivos fuente generados.

  • -verbose

    Especifica que se han de generar mensajes de salida relacionados con las acciones del compilador.

  • -version

    Imprime la información de versión. Si especifica esta opción, en la salida sólo se incluirá la información de versión y no se llevará a cabo el proceso normal de mandatos.

  • -wsdlLocation

    Especifica el valor @WebServiceClient.wsdlLocation.

  • Configuraciones soportadas: La herramienta wsimport no establece el valor @WebsService.wsdlLocation ni por omisión ni cuando se especifica el atributo -wsdlLocation. La herramienta de línea de mandatos wsimport, únicamente actualiza la anotación @WebServiceClient.wsdlLocation. Puede actualizar manualmente la anotación @WebService.wsdlLocation con un URL relativo que especifica la ubicación del archivo WSDL (Web Services Description Language). Si la anotación @WebService.wsdlLocation está presente en una clase de implementación de punto final, entonces el valor debe ser un URL relativo y el documento WSDL al que hace referencia debe estar empaquetado con la aplicación.

Se pueden generar de dos maneras desde el servidor que está desplegado o desde local

Hay que tener encuentra la ip del servidor en mi caso seria de la siguiente manera

wsimport
-s C:\JAXWS\pruebaWebservices\salida\src -verbose

En la ruta de src nos crea todas las fuentes

Ahora montamos un proyecto java en el eclipse:

Montamos el proyecto y creamos un paquete que se llama cliente

Y en el paquete una clase (Llamadas.java)

Luego exportamos a un Runnable jar file o ejecutamos desde el eclipse como una aplicación java.

Desde eclipse:


Desde la consola:


Archivos:

Anuncios
Minientrada | Esta entrada fue publicada en Jax-WS. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s