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>
public static void main(String [] args) {
Endpoint.publish("http//localhost:8080/MiServicio", new MiWebService());
// Aqui puedes seguir haciendo cosas.
}
Hola
yo te puedo mandar uno de ejemplo que usa axis2 tanto el webservice como el cliente…
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.
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
Pingback: de la red – 29/09/2010 « Tecnologías y su contexto
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.
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.