jax-ws y maven

 Siguiendo con los web services y yo, he estado probando herramientas como axis2 y jax-ws. Por supuesto, nada me ha funcionado a la primera y llevo casi dos días peleándome con esto para arrancar un "hola mundo"

Con axis2 el problema es que se me ocurrió hacerme mi propia clase de ejemplo, sin copiar la de los tutoriales. Al final descubro que no soporta enumerados de java y qué casualidad, a mí se me había ocurrido poner uno de los métodos con un parámetro enumerado. Una vez conseguido arrancar un servidor y hacerme un cliente, el servidor me da error cuando intento acceder al web service desde el ciente. Ante las pocas pistas que daba el error, decidí dejar axis-2 de momento y probar con jax-ws.

Con jax-ws me cree un proyecto maven y me puse a ello. Pues bien, las dependencias maven teóricas según la documentación son estas https://jax-ws.dev.java.net/guide/Using_JAX_WS_from_Maven.html . Creo el proyecto, arranco el servidor y todo aparentemente correcto. Accedo desde un navegador a http://localhost:8080/MiServicio?WDSL con el que teóricamente debería obtener el fichero WSDL del servicio… y el servidor da error. Buscando el error por google, me encuentro con esto http://forums.java.net/jive/message.jspa?messageID=222799 Parece que la librería sjsxp de la que depende según maven el jax-ws no es correcta y hay que coger la versión 1.0.1 en vez de la 1.0. Así que me toca "tunear" el pom.xml y hacer esta ñapa

 

<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.1.1</version>
<exclusions>
<exclusion>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
<version>1.0.1</version>
</dependency>
Dicho de otra forma, poner la dependencia de jaxws-rt, decirle que no me traiga su sjsxp y luego poner la dependencia del que yo quiero. Esto ha funcionado bien y ya tengo el servidor arrancado. Ahora toca pelearse con el cliente…. espero no tener demasiados problemas. Luego volveré con axis2.
 
Y aunque todavía tengo que probar más, de momento me gusta mucho más jax-ws que axis2. Los scripts de axis2 generan montones de clases que luego tampoco facilitan tanto la creación de un cliente. jax-ws también genera clases, pero parece que son menos y además quedan "ocultas", ya que genera los .class que luego se empaquetan en el war o jar.
 
Lo segundo que no me ha gustado de axis2 es que aparentemente no tiene posibilidad de hacer un main() que arranque un servidor web con los webservices, dependemos de un Tomcat ajeno con una webapp axis2 instalada sobre la que desplegamos nuestros web services. Bueno, sí tiene un servidor, pero según la documentación puede usarse sin garantías, ya que no está soportado. jax-ws permite hacerse un main y publicar el servicio de una forma tan fácil como esta
public static void main(String [] args) {
   Endpoint.publish("http//localhost:8080/MiServicio", new MiWebService());
   // Aqui puedes seguir haciendo cosas.
}
Bueno, no es nada grave si quieres publicar webservices en internet. Pero en mi caso, necesito que el servidor aparte de publicar los webservices, haga más cosas.
Esta entrada ha sido publicada en Herramientas, java, maven y etiquetada como , , , , . Guarda el enlace permanente.

6 respuestas a jax-ws y maven

  1. carlos dijo:

    Hola

    yo te puedo mandar uno de ejemplo que usa axis2 tanto el webservice como el cliente…

  2. dmcom dijo:

    Yo también me he tenido que pelear con los Web Services en java por mi cuenta y es un auténtico infierno.

    Resulta más sencillo hacer una aplicación en C con MPI en donde mil procesos se comunican en un cluster pasandose datos a tener que lidiar con las malditas configuraciones de las diferentes librerias para hacer un web service del tres al cuarto, y este ejemplo a mi me resulta aplastante.

    Yo también me encontré con el problema de las colecciones con jax-ws y con un bug de un timeout a través de una configuración mediante spring.

    Al final tardé muchisimo más en pelearme con todo que en hacer el web service.

    En grails con REST parece que la cosa está mejor montada, eso si, si te haces tu el cliente y el servidor en grails, pero tienes otros problemas como el de la seguridad.

  3. Carlos Chacin dijo:

    A mi particularmente me es mas conveniente hacer los servicios web definiendo primero el contrato con un XSD y generar automáticamente las clases java a partir de ese contrato con el plugin JAXB2 de maven, una vez hecho esto uso spring-ws para publicar el servicio definiéndolo en XML y del mismo modo para el cliente.
    axis2 me parece muy engorroso y el hecho de hacer contract first en lugar de contract last te evita problemas como los que mencionaste de las enumeraciones y las referencias cíclicas entre otras cosas. Saludos

  4. Pingback: de la red – 29/09/2010 « Tecnologías y su contexto

  5. R dijo:

    Cuando trabajé con axis, me pareció super engorroso, aparte de lo que mencionas sobre la cantidad de clases que genera. Y sin mencionar ciertas carencias que tiene.

    Un partner del proyecto nos dijo que él usaba XFire (ahora se ha integrado en CXF, de Apache). No se si lo conoces, pero la diferencia es importante, aunque solo fuera por la claridad.

  6. Chuidiang dijo:

    No conocía CFX, le voy a echar un ojo con calma, gracias. Así, en primera aproximación, se parece mucho a la forma de trabajo con jax-ws. De hecho, creo que pone que está construido sobre jax-ws. Tengo que mirar si facilita las cosas respecto a jax-ws.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.