Desarrollar un webservice desde WSDL con Axis2

July 24, 2007

Siguiendo con el motor de webservices Axis2, en esta ocasión toca hablar sobre cómo desarrollar un webservice. Logicamente existen diversas formas de desarrollar un webservice, en el siguiente texto voy a contar cómo desarrollar un webservice siguiendo la metodología conocida por WSDL to Java y qué ventajas reporta. Antes permitidme introduciros brevemente en el mundo de los webservices.

Presentaciones
Un webservice o servicio web es una aplicación modular, auto-contenida, auto-descriptiva, sin estado y accesible a través de Internet. Su objetivo es la interoperabilidad entre aplicaciones, con un mínimo acoplamiento e independientemente de la tecnología con la que hayan sido desarrolladas.

webservices

Para lograr la interoperabilidad, aparte de basarse en estándares, un webservice se comunica mediante mensajes XML utilizando el protocolo SOAP. El interfaz de un webservice se describe en un documento XML utilizando el estándar WSDL. En este fichero, que recibe el mismo nombre WSDL, se definen los detalles de cómo usar un webservice, como las operaciones, el formato de los mensajes, el tipo y el protocolo de transporte del webservice.

El WSDL es, por tanto, básico a la hora de crear un cliente para un webservice y debería ser cuidadosamente diseñado. Un buen diseño evitará problemas de interoperabilidad aunque se empleen tecnologías diferentes a la del webservice para crear los clientes. Por ello, debería ser de máxima importancia durante el desarrollo de un webservice.

Empezando la casa por el tejado
Sin embargo, y descartando la opción de parsear los XML a pelo, es habitual encontrarse con un enfoque radicalmente contrario. Partiendo de la implementación de la lógica del webservice (una clase Java) se genera de forma automática el WSDL correspondiente. El nombre de este método es Java to WSDL. Pero al seguirlo estamos condicionando la interoperabilidad del webservice a la bondad de la herramienta empleada para generar el WSDL. A cambio se facilita el desarrollo (ahora incluso con anotaciones) del webservice.

Este enfoque funciona bien para servicios web realmente sencillos, con métodos de pocos parametros de tipo básico. Pero puede (casi seguro) dar problemas de interoperabilidad en webservices con mensajes complejos si se usan tecnologías distintas (aunque sean del mismo lenguaje) para el webservice y los clientes. No se puede obviar que diferentes herramientas generan diferentes WSDLs a partir de la misma clase Java…

Otra desventaja de usar este enfoque es que estamos haciendo al interfaz del webservice depender de la implementación. Adiós abstracción entonces. Si mañana cambia la implementación es más que posible que deba cambiar el interfaz (WSDL) y, por tanto, también todos los clientes que se hubieran creado. Además habremos perdido el control sobre el diseño del interface del webservice, en realidad la cara de todo servicio web, lo que todo el mundo que va a ver y donde merece la pena emplear tiempo para que sea lo más amigable y comprensible.

El camino
La alternativa que en este tutorial se propone es actuar justo al revés y de forma más natural. Primero se define el interfaz del webservice, es decir, el WSDL, donde se describen las operaciones, el formato de los mensajes, el tipo y protocolo de comunicación. Entonces se generan de forma automática las clases Java que implementan tanto el esqueleto del webservice como sus mensajes. Este método se llama WSDL to Java.

No sólo es más natural el orden de hacer las cosas, primero el interfaz, luego la implementación. También es mucho más natural y ágil describir los mensajes XML del webservice usando schemas XML en vez de clases Java. Otras ventajas son evitar los posibles efectos colaterales en la interoperabilidad sufridos por la generación automática del WSDL, y no perder el control sobre su diseño.

En realidad, y como veremos, crear un WSDL no es tan complicado, mientras no vayamos la primera vez en plan comando con un editor de textos básico. Tranquilidad, porque además no hace falta empollarse la especificación del W3C, sólo un buen IDE y tener claros un par de conceptos. No me enrollo más. Allá vamos!

Preliminares
Para seguir este tutorial antes deberias instalar:

  • JDK 1.4 o superior, con la variable de entorno JAVA_HOME configurada.
  • Eclipse 3.3 + wtp 2.0 o superior. Puedes descargar desde aquí el pack all-in-one.
  • Axis2 1.2 Standard Binary Distribution. No olvides configurar la variable de entorno AXIS2_HOME. Si necesitas ayuda para instalar Axis2 puedes consultar el artículo anterior Instalando Axis2.

Estructura de un webservice en Axis2
Axis2 utiliza un modelo propio de empaquetamiento para webservices. Este nuevo modelo permite a Axis2 el despliegue en caliente y auto-actualización de los webservices de su repositorio. La estructura de este modelo es similar al conocido jar, pero con las siguientes diferencias:

  1. La extensión para un webservice es aar en vez de jar.
  2. Debe existir un fichero descriptor del webservice llamado services.xml. Este fichero se puede generar automáticamente, así que no es problema.
  3. A nivel raíz existirá una carpeta llamada META-INF que contendrá el citado services.xml y, opcionalmente, el fichero WSDL para devolver en lugar de uno autogenerado por Axis2.

Descripción del webservice myVirtualShop
Es el momento de presentar al webservice que nos acompañará durante toda esta serie de tutoriales sobre Axis2.

Imaginemos que tenemos que crear una capa de webservices para ampliar el sistema de ventas por Internet de un negocio que quiere ir más allá de la típica aplicación web de tienda virtual. Esta opción permitirá a los clientes del negocio automatizar su proceso de compras y optimizar su sistema de control de inventario inteligente. Las aplicaciones de los clientes y del negocio van a poder comunicarse de un modo estándar y, lo más importante, independientemente de la tecnología propia de cada una.

Las operaciones del webservice que vamos a implementar son: obtener el catalogo de productos, búsqueda de productos, hacer un pedido y consultar el estado de un pedido. Las llamaremos getCatalog, search, order y getOrderState, respectivamente.

En el supuesto modelo de datos de la aplicación, los productos que componen el catálogo formarán parte de una categoria (sólo una) y tendrán una referencia (única), un nombre, una descripción, una disponibilidad y un precio.

Preparación del entorno de desarrollo
Como entorno de desarrollo voy a utilizar eclipse con sus webtools, y así probar su editor de wsdl y schemas, más el plugin para eclipse, Code Generator Wizard de Axis2. Los plugins de Axis2 se pueden descargar aquí y para instalarlos basta con descomprimirlos en la carpeta plugins del eclipse y luego arrancar eclipse.

Para evitar tener todos los jar del Axis2 inundando la vista de nuestro proyecto vamos a crear una libreria de usuario. Abre la pantalla Window/Preferences, selecciona Java/Build Path/User Libraries. Crea una nueva variable de usuario, llamala AXIS2 y añade dentro todos los jar de la carpeta lib de la distribución del Axis2.

axis2 user library

Creación del proyecto myVirtualShop
Para crear un proyecto de un webservice en Axis2 basta con crear un proyecto Java. Le asignamos un nombre, myVirtualShop por ejemplo, y le añadimos la libreria de usuario que hemos creado para los jar de Axis2. A mi siempre me gusta separar las carpetas de los fuentes y los binarios.

Ahora creamos las carpetas META-INF y resources. Si fueramos a necesitar alguna otra libreria como hibernate, spring, etc. creariamos también una carpeta lib, copiariamos los jars dentro y los añadiriamos al build path del proyecto.

proyecto

Schemas
El primer paso del desarrollo del webservice es definir el formato de los mensajes XML de cada operación. Para ello vamos a crear un schema XSD donde se definan los elementos de entrada y salida de las operaciones del webservice. Se podría crear más de un schema, quizás lo recomendable es uno por mensaje, pero por simplificar lo dejaremos en un solo schema.

Crear un schema no es complicado, sobretodo si se cuenta con un buen editor visual. Es similar a crear arboles, se empieza por definir un elemento del que pueden colgar secuencias de otros elementos y así sucesivamente. Los elementos tienen un nombre y pueden tener atributos. Tanto los atributos como los elementos que serían las hojas del árbol tienen un tipo. Al elemento que sería la raíz del árbol se le denomina global. Una buena práctica es hacer globales los elementos que se vayan a reutilizar, como el elemento Producto al que se hace referencia en las respuestas de las operaciones getCatalog y search.

El editor XML de las WTP de Eclipse no está mal. Su punto fuerte es la refactorización. Puedes cambiar el nombre, orden y tipo de elementos y atributos sin problemas. Lo que no me ha gustado es que sólo es capaz de mostrar 2 profundidades a la vez en pantalla. Para avanzar en la jerarquía tienes que seleccionar el elemento más profundo (derecha). En general prefiero el XMLSpy, pero no es gratis.

El schema se llamará myVirtualShop.xsd, con http://www.example.org/myVirtualShop/messages como namespace e irá en la carpeta META-INF. Dentro del schema se define un elemento global por cada mensaje. Los mensajes son getCatalogRequest, getCatalogResponse, searchRequest, searchResponse, orderRequest, orderResponse, getOrderStateRequest y getOrderStateResponse. Su formato puede examinarse en las siguientes figuras.

getCatalogRequestgetCatalogResponsesearchRequestsearchResponseorderRequestorderResponsegetOrderStateRequestgetOrderStateResponse

Unos ejemplos de los XML resultantes: 1, 2, 3, 4, 5, 6, 7 y 8.

Los elementos Producto y Catalogo se han hecho globales para poder reutilizarse en distintos mensajes. Producto para reutilizarse en getCatalogRequest y searchResponse, y Catalogo por si en un futuro se desea crear una nueva operación que lo use.

Éste es el schema final, copialo a META-INF y refresca el proyecto. Ojo! borra la extensión jpg y dejalo en xsd (lo mismo para los siguientes ficheros, cosas de la administración del blog…).

El temido WSDL
Ahora vamos a crear el interfaz del webservice, el WSDL. Selecciona File/New/Other/Web Services/WSDL. Colócalo en META-INF y dale un nombre, myVirtualShop.wsdl. Pulsa Next. El target namespace será http://www.example.org/myVirtualShop/wsdl. Lo demás dejalo como está: SOAP como protocolo y la opción document literal. Es decir, va a ser un webservice basado en intercambio de documentos mediante SOAP.

Ya tenemos delante un esqueleto del WSDL. Echale un ojo a la vista Source y verás los distintos elementos que forman un WSDL:

  • Service: el servicio en sí. El nombre del servicio y del puerto se usan para formar la url con la que acceder al servicio, también llamada endpoint. Su formato es el siguiente: http://host:puerto/axis2/services/nombre_portType.
    El atributo location puedes dejarlo como está. El propio Axis se encargará de modificarlo según sea necesario.
  • PortType: es el interfaz donde se definen las operaciones del webservice.
  • Binding: especifica el protocolo concreto, el tipo de webservice y los formatos de las operaciones de un PortType concreto.
  • Message: define los mensajes de cada operación del webservice.
  • Types: es un elemento contenedor para definir los tipos de datos o elementos que serán usados en los mensajes. Las definiciones se hacen con schemas XSD.

Aunque un buen editor visual te abstrae de muchos de estos detalles es más que recomendable familiarizarse con el código y la sintaxis.

Lo primero que vamos a hacer es importar dentro del WSDL el schema donde hemos definido previamente los elementos que forman los mensajes. En este punto el editor no funciona muy bien y lo mejor es hacerlo a mano. Desde la vista Source del editor cambia el fichero para que sea igual que este:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:tns="http://www.example.org/myVirtualShop/wsdl"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:msg="http://www.example.org/myVirtualShop/messages"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="myVirtualShop"
 targetNamespace="http://www.example.org/myVirtualShop/wsdl">
    <wsdl:types>
        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:import
    namespace="http://www.example.org/myVirtualShop/messages"
    schemaLocation="myVirtualShop.xsd">
   </xsd:import>     
        </xsd:schema>
    </wsdl:types>

[…]

Una vez definidos los tipos podemos usar el editor visual para ir creando las distintas operaciones y mensajes correspondientes. Ve a la vista Design del editor. De izquierda a derecha están representados los elementos service, binding y port type. Verás que ya existe una primera operación genérica. Vamos a cambiarle el nombre por getCatalog y asignar como mensajes de entrada y salida los elementos existentes dentro del proyecto getCatalogRequest y getCatalogResponse respectivamente.

wsdl inicial

Para cambiar el nombre de la operación, haz doble click sobre el primer NewOperation. Para asignar el elemento getCatalogRequest haz click derecho sobre el elemento de entrada NewOperation a la derecha de input. Selecciona Set Element/Existing. En Search Scope marca Enclosing Project para ver la lista de elementos disponibles. Selecciona el elemento getCatalogRequest de nuestro schema. Ahora haz lo mismo para la respuesta NewOperationResponse, el elemento que tienes que asignar es, lógicamente, getCatalogResponse.

Fácil, no? Pues ahora crea el resto de operaciones: search, order y getOrderState, y asignales sus correspondientes mensajes de entrada y salida.

Ojo! Lo cierto es que el editor aún falla bastante. Por ejemplo, al crear una nueva operación creará un schema interno en types para los tipos de los mensajes. Lo podrás ver en la vista Outline. Debes elegir siempre como elementos de los mensajes los del schema myVirtualShop.xsd. Y al terminar el WSDL borra este schema interno que se crea solo y cualquier rastro suyo.

Finalmente debemos actualizar el contenido del binding con las nuevas operaciones. Para ello haz click derecho sobre el binding y selecciona Generate Binding Content.

En cualquier momento puedes validar el WSDL haciendo click derecho sobre él en la vista Package Explorer y seleccionando Validate.

Éste es el WSDL final y como quedaria en el editor visual.

wsdl final

WSDL2Java
Lo más traumático ya ha pasado. Ahora con el WSDL ya definido vamos a crear las clases del webservice a partir de él. Para ello haremos uso del plugin Code Generator Wizard de Axis2 que previamente hemos instalado y ejecutaremos el método WSDL2Java.

Selecciona File/New/Other/Axis2 Wizards/Axis2 Code Generator, elije el wizard para generar código Java a partir de un fichero WSDL e indica la localización del WSDL. A continuación aparecerá la pantalla de opciones. En ella puedes elegir entre generar código para servidor, cliente o ambos, puedes indicar el motor de Databinding a usar y asignar mapeos entre namespaces XML y packages Java. Nosotros vamos a generar código Java para servidor usando adb como motor de Databinding y el fichero descriptor del webservice, services.xml. Para ello haz lo siguiente:

  1. Selecciona la opción custom para Codegen option.
  2. Indica org.example.myvirtualshop.ws como Custom package name.
  3. Selecciona Generate server side code y Generate a default services.xml.
  4. Indica el nombre de package org.example.myvirtualshop.ws para el namespace http://www.example.org/myVirtualShop/ws.
  5. Indica el nombre de package org.example.myvirtualshop.ws.messages para el namespace http://www.example.org/myVirtualShop/ws/messages.

La pantalla quedaría así:

Pantalla Opciones del Axis2 Code Gen

Para finalizar sólo queda seleccionar el destino del código generado. En la siguiente pantalla indica el proyecto MyVirtualShop. Para ello selecciona la primera opción, Browse and select a project […], e indica el proyecto MyVirtualShop en el diálogo Browse. Pulsa Finish y listo!

Si refrescas el proyecto podras ver todo lo generado:

  1. En src, el package org.example.myvirtualshop.ws que contiene las clases MyVirtualShopMessageReceiverInOut y MyVirtualShopSkeleton. Ésta última es la clase skeleton que hay que completar para dotar de funcionalidad al webservice, si le echas un vistazo verás que tiene un método por cada operación. La primera se encarga de recibir y enviar los mensajes de forma transparente.
  2. En src, el package org.example.myvirtualshop.ws.messages con las clases que implementan los elementos XML de los mensajes del webservice según el motor Databinding empleado.
  3. En resources, el fichero descriptor services.xml y los ficheros temporales myVirtualShop.wsdlxsd0.xsd utilizados durante la generación de código.
  4. En el raíz del proyecto, el script ANT build.xml que usaremos para empaquetar el webservice en un fichero aar.

Decepciones
A más de uno le habrá sorprendido encontrarse con esos sufijos _typeX en los nombres de las clases generadas para los mensajes. Sinceramente a mi también y me parece imperdonable para una versión 1.2. Más aún si tenemos en cuenta que este comportamiento no ocurría en Axis1.

La herramienta todavía contiene más bugs o defectos que ya estaban solucionados en Axis1. Por ejemplo, no hay manera de que sobreescriba el código generado, tienes que borrar primero, inexplicable también el formato e indentación de la clase skeleton. Además si usas XMLBeans como motor de Databinding ya te aviso que no funciona para todos los WSDLs, al menos yo he tenido problemas con varios.

Implementación
Para poder probar el webservice sin obtener un molesto AxisFault vamos a añadir una clase mock que implemente las operaciones del webservice y en la que delegue la clase skeleton. Ojo! Esto no es más que un prototipo rápido que sería sustituido en un desarrollo real.

La clase mock es ésta. Más tonta no puede ser. Crea el nuevo package org.example.myvirtualshop.ws.mock y cópiala dentro.

Ahora modifica la clase skeleton para que delegue en el mock. El código quedaría así:

import org.example.myvirtualshop.ws.mock.MyVirtualShopMock;
/**
 *  MyVirtualShopSkeleton java skeleton for the axisService
 */
public class MyVirtualShopSkeleton{
  public org.example.myvirtualshop.ws.messages.GetCatalogResponse getCatalog(org.example.myvirtualshop.ws.messages.GetCatalogRequest getCatalogRequest){
    MyVirtualShopMock mock = new MyVirtualShopMock();
    return mock.getCatalog(getCatalogRequest);
  }
  public org.example.myvirtualshop.ws.messages.SearchResponse search(org.example.myvirtualshop.ws.messages.SearchRequest searchRequest){
    MyVirtualShopMock mock = new MyVirtualShopMock();
    return mock.search(searchRequest);
  }
  public org.example.myvirtualshop.ws.messages.OrderResponse order(org.example.myvirtualshop.ws.messages.OrderRequest orderRequest){
    MyVirtualShopMock mock = new MyVirtualShopMock();
    return mock.order(orderRequest);
  }
  public org.example.myvirtualshop.ws.messages.GetOrderStateResponse getOrderState(org.example.myvirtualshop.ws.messages.GetOrderStateRequest getOrderStateRequest){
    MyVirtualShopMock mock = new MyVirtualShopMock();
    return mock.getOrderState(getOrderStateRequest);
  }
}

Empaquetar y desplegar
El desarrollo ya está terminado, sólo falta empaquetar y desplegar. Para empaquetar vamos a usar ANT porque el plugin Service Archiver de Axis2 deja mucho que desear (y va otra decepción).

Antes debemos preparar el proyecto. Para ello borra los ficheros temporales ficheros temporales myVirtualShop.wsdlxsd0.xsd en resources y copia desde META-INF a resources los ficheros myVirtualShop.wsdl y myVirtualShop.xsd. El proyecto quedaría así:

Para usar ANT debes abrir la vista ANT del Eclipse y arrastrar dentro el fichero build.xml. Haz doble click en el task jar.server y refresca el proyecto cuando termine. El webservice habrá quedado empaquetado en un fichero Services.aar en la carpeta recien creada build/lib. Cámbiale el nombre myVirtualShop.aar.
(Actualización 06/08/2007: Si obtienes un error de javac al ejecutar ANT asegurate que en la variable path del sistema se apunta a la carpeta bin del JDK)

Toca desplegar, tan sólo tienes que copiar el webservice al repositorio de Axis2, en services, y arrancar el servidor con el script axis2server situado en bin. Para comprobarlo abre en un navegador la url http://localhost:8080/axis2/services/ y verás el webservice myVirtualShop desplegado junto al Version de Axis2.

Por supuesto todo este proceso de empaquetamiento y despliegue se podría automatizar un poco más con un nuevo task de ANT. También se podría haber ejecutado Axis2 sobre un Tomcat. He preferido dejarlo así por sencillez.

Bien, pues esto es todo entonces. Si no puedes esperar al siguiente artículo para crear un cliente y probar el webservice, puedes usar alguna herramienta tipo XMLSpy, JMeter o SoapUI que permiten invocar las operaciones de un webservice a partir de su WSDL. Para acceder al WSDL de un servicio Axis basta con añadir el sufijo ?wsdl al endpoint del servicio, sería: http://localhost:8080/axis2/services/myVirtualShop?wsdl.

Conclusiones
Me ha quedado un post realmente largo y a priori podría parecer que desarrollar un webservice con WSDL2Java es dificil y complicado, sobretodo si lo comparamos con los últimos Helloworld de Java2WSDL + anotaciones con Netbeans. Pero no sería una comparación justa, aquí se ha desarrollado un webservice con un interfaz relativamente complejo y no un simple Helloworld que devuelve un String.

Si bien en la actualidad WSDL2Java no es la metodología con mayor apoyo por parte de la industria, en mi opinión es la metodología más adecuada para construir un webservice de complejidad media/alta respetando al máximo la interoperabilidad, el principal objetivo de los webservices, y cuidando el desarrollo del interfaz del servicio.

Si el interfaz de un webservice son los mensajes XML qué mejor forma de definir el formato de un documento XML que con schemas XSD. Construir luego el WSDL puede costar al principio (como todo lo nuevo) pero en realidad es un proceso mecánico. A cambio obtendremos de un modo automático todas las clases Java necesarias para realizar el intercambio de mensajes. ¿Merece la pena aprender a construir un WSDL? Para mi sí, sin duda.

46 Comments »

The URI to TrackBack this entry is: http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/trackback/

  1. Ojo! El número en los sufijos _typeX comentados más arriba es aleatorio y varia en cada ejecución del wsdl2java. Sin comentarios.

    El caso es que debido a esto, y a no ser que la providencia se alie con vosotros, será necesario un pequeño refactoring o bien en el código del mock o bien en los nombres de las clases de los mensajes específico para cada caso.

    Comment by Administrator — July 25, 2007 @ 1:54 pm

  2. Hola Julio. He seguido tu tutorial y estoy parado en el paso de crear las clases java a partir del Codegen Wizard. Cuando llego al apartado del Output he seleccionado Browse and select a project on current eclipse workspace y al pulsar Finish me da el siguiente error : An error ocurred while completing process -java.lang.InterruptedException: java.net.URISyntaxException: Illegal character in path at index 12: file:/D:Mis documentos/workspace/myVirtualShop/META-INF/.
    He dejado los parametros tal y como pones en el tutoril, he mirado la imagen del Namespace y la tengo igual que la que tu comentas. Utilizo Eclipse 3.2. Si puedes te agradecere que me respondas.
    Saludos y gracias por precocuparte por la comunidad de sufridores.

    Comment by Andres Ortega — August 2, 2007 @ 9:31 am

  3. Hola Julio, he conseguido saber lo que pasaba, he cogido el worspace de Eclipse y lo he puesto en la raiz, d:worspace, he realizado el proceso y ha funcionado. Anteriormente lo tenia en d:Mis documentosworspace…. y parece que habia algún problema con la ruta.

    Comment by Andres Ortega — August 2, 2007 @ 3:06 pm

  4. Ahora tengo otro problema. La cuestión es que yo no he utilizado nunca ANT. Al pulsar con doble click sobre jar.server en la consola visualiza el siguinte mensaje:
    init:
    pre.compile.test:
    [echo] Stax Availability= true
    [echo] Axis2 Availability= true
    compile.src:
    [javac] Compiling 23 source files to D:workspacemyVirtualShopbuildclasses

    BUILD FAILED
    D:workspacemyVirtualShopbuild.xml:43: Error running javac.exe compiler

    Total time: 969 milliseconds

    y no ha generado lo esperado en build.

    ¿Alguien me puede hechar un cable?.

    Gracias.

    Comment by Andres Ortega — August 2, 2007 @ 3:14 pm

  5. Hola Andres.

    Muchas gracias por tus comentarios, me alegro mucho que te haya servido.

    En cuanto a tu error puede ser cualquier cosa, faltaria un poco más de información, al menos la linea del build.xml. Aunque lo primero que debes mirar es que tienes el JDK correctamente instalado para disponer del javac.

    Abre una consola y ejecuta javac, si no funciona tienes que poner la carpeta bin del JDK en la variable path del sistema. Luego vuelve a arrancar eclipse y prueba de nuevo a ejecutar el ANT.

    Siento no poder ayudarte más pero no tengo a mano un eclipse + axis2. Pero vamos a ver si lo solucionamos. Por favor tenme informado para actualizar el tutorial.

    Un saludo.

    Comment by Administrator — August 4, 2007 @ 11:08 am

  6. Hola Julio.
    Gracias por tus apuntes. Ha funcionado correctamente. He podido crear el Servicio con ant desde eclipse. Permiteme que me aproveche de ti un poquito aunque creo que debes estar de vacaciones. He de desarrollar uno o varios servicios web para que puedan enviarme información basada en XML y he de conectar con un servicio web (del cual espero que me digan la url y el servicio a invokar) para enviar un mensaje XML. La situación es , tienes algún tutorial con los APIS de JAVA (no se si es JAXM) a utilizar par poder implementar los mensajes XML desde clases basicas. Ademas necesitaré conocer el sistema de asociación de mnesajes XMN a DTD o XSD para poder interpretar el mensaje recibido en XML y pasarlo a una clase básica. (Clase basica me refiero a la tipica clase Pais,Cliente,etc…).

    De todas formas gracias por tus aportaciones.

    Saludos cordiales.

    Comment by Andres Ortega — August 7, 2007 @ 11:43 am

  7. Hola Andres.

    Me alegro que funcionara!

    Creo que hablas de mapear (databinding) XML a clases JavaBean y viceversa. Cuando usas wsdl2java se generan automaticamente las clases Java necesarias para ello. Axis2 puede usar como motor de databinding adb, XMLBeans y al menos otro más, creo que se llama JIXBE pero aun esta un poco experimental. Para cosas sencillas yo recomiendo adb.

    Fuera de Axis2 existen otros motores, creo que tu te refieres al JAXB2 de Sun. Habia un par de tutoriales en el portal devX y una noticia relacionada en javaHispano.

    Para crear un cliente webservice sólo necesitas el wsdl del servicio y usar wsdl2java. Para ello puedes usar el plugin de Axis2 Code Gen de forma muy similar a lo visto en este tutorial. Pero si tienes un poco de paciencia tengo el proximo tutorial sobre crear un cliente webservice a medias.

    Un saludo.

    Comment by Administrator — August 7, 2007 @ 10:58 pm

  8. En el ejemplo que presentas no veo como anexas spring en el webs ervice. Tengo un problema fuerte, estoy exponiendo un web service (axis2) que accesa a una base de datos a través de spring por lo que usa un contexto.xml en mi aar yo empaqueto las librerias, las clases binarias y el contexto, pero cuando un cliente lo quiere consumir aparecen errores como que las clases de spring no existen, el contexto tampoco y lo que es peor ni las clases que son de mi propiedad (para resolver la bronca copie mis clases y el contexto.xml en el directorio clases del contenedor de axis2 y las librerias de spring en las librerias del contenedor de axis2), pero como te das cuenta eso no es lo mejor, por alli hay alguna documentación que dice que spring se inicializa primero y que el servicio a exponer recibe dos parámetros el bean a trabajr y el contexto. Yo ya tengo toda la funcionalidad sólo requiero hacer uso del bean en el servidor que se supone obtengo como parametro. Como hago esto.

    Gracias por ayudarme

    Comment by yuli noriega — August 8, 2007 @ 7:05 pm

  9. Hola yuli.

    Me temo que no puedo ayudarte, no he llegado a usar Axis2 + spring. Lo que comento en el tutorial es cómo configurar el proyecto de un webservice para usar alguna libreria externa (pej: hibernate, spring, junit,…).

    Echale un ojo a la documentación de Axis2:

    Un saludo.

    Comment by Administrator — August 8, 2007 @ 9:10 pm

  10. Hola,
    enhorabuena y gracias por tu artículo.
    Siempre he tenido una respecto a axis2 y webservice: el archivo .wsdl sirve como interfaz entre la aplicación y el cliente para que éste último sepa que protocolos de transmisión de mensajes usa la aplicación y detalles de su contenido, pero, ¿como sabe usar o descrifrar el cliente ese .wsdl? ¿como se establece el contrato o el contacto entre el .wsdl y el cliente para que éste acepte esos términos y protocolos? Gracias y un saludo.

    Comment by enteDela Red — August 9, 2007 @ 5:07 pm

  11. Hola Julio. ¿Para cuando prevees tener el cliente en AXIS2 y el Code Gen?.

    Saludos cordiales.

    Andrés.

    Comment by Andres — August 10, 2007 @ 10:52 am

  12. Andres: ahora mismo estoy muy muy ocupado en el curro y no tengo tiempo para terminarlo. Si tienes mucha prisa te recomiendo que lo intentes por ti mismo, es realmente sencillo, es lo mismo que para un ws, salvo que marcas la casilla de codigo cliente. Si aun así no te atreves, pasate a finales de la semana que viene y quizas haya suerte ;-)

    Ente: muchas gracias por tu comentario. Tratare de responder a tu pregunta aunque no la entiendo muy bien.

    Como tu bien dices el wsdl define un contrato, yo lo llamaria interfaz, de como usar un webservice (protocolo y formatos de mensajes XML). El propio fichero wsdl es un documento xml así que es “facilmente” entendible por una persona. Si quieres usar el webservice, tienes que seguir su interfaz (para ti contrato). Por tanto el cliente según lo que quiera hacer tendrá que enviar un mensajes XML que se ajuste al formato definido en el wsdl usando el protocolo y la direccion establecidas en el wsdl. Esto se puede hacer más manual (construir xml a pelo + enviar a pelo usando soap) o más automático (wsdl2java + construir xml con javabeans + enviar llamando a un metodo del stu y pasandole como parametro un javabean).

    Espero haberte ayudado!

    Un saludo.

    Comment by Administrator — August 14, 2007 @ 11:27 pm

  13. Hola Julio, he resuleto la parte del contexto, recuerdas “axis2 con spring”, pero ahora mi problema es que las clases de spring que las traigo enpaquetadas en el archivo aar no las puede ver el web service cuando esta deployado, he visto alguna documentación y lo que sugieren es que las librerias las meta en aar dentro del directorio lib y asi lo he hecho pero aún asi no funcionan, he incluso tratado con el manifest.mf y tampoco, tiene una idea de como hacer para no copiar las librerias de spring en el directorio lib de axis2, sino más bien que vayan implicitas en el archivo aar?.

    Gracias de antemano;
    Yuli

    Comment by yuli noriega — August 16, 2007 @ 6:45 pm

  14. Hola Yuli.

    Es normal que no te funcione, el atributo classpath del manifiest es para meter jars en el classpath pero que esten accesibles en el sistema de ficheros, no dentro de otro jar/aar.

    No se porque no te gusta poner los jars en el /lib del axis2. Esta precisamente para eso.

    ¿Otras opciones?
    Puedes descomprimir los jars en tu proyecto, junto a tus clases y hacer 1 unico jar (esto si que es una chapuza).
    Tambien puedes hacer una ultima prueba con los jars dentro del aar y usar un classloader. Esto no se si funcionara, nunca lo he probado, sólo es una idea rápida!

    Yo de todas formas los meteria en el /lib del axis2 y punto.

    Un saludo.

    Comment by Administrator — August 17, 2007 @ 1:57 pm

  15. Hola Julio.
    He estado realizando pruebas para generar un servicio web utilizando una estructrua de datos basada en XML (HL7, es un estandard para sanidad). Para generar el WDSL he generado un par de opraciones donde relaciona los mensajes HL7, tanto en el request como en el response siguiendo tu tutorial.
    La cuestión es que cuando creo tener el wsdl y le digo a Eclipse que me valide el wsdl me da un warning, cosa que con tu ejemplo no da.
    Cuando utilizo el plugin Code Generator Wizard de Axis2 me peta.
    Solo he querido definir una operación para ver el resultado, he de implementar 8 más pero hasta que no vea claro el primero, entiendo que el código xml es más claro para poder verigar que es lo que pasa.
    No se si es que esta verde AXIS2 o que es lo que hago mal.
    Si me puedes pasar tu e-mail te documento en un word to lo que hago con pantallas para que no pierdas el tiempo interpretando lo que me ocurre.

    Te agradece calquier tipo de ayuda.

    Gracias

    Comment by Andres — September 7, 2007 @ 12:33 pm

  16. Hola Julio.
    Se me ha olvidad el e-mail : aoh@abaforum.es

    Saludos.

    Comment by Andres — September 7, 2007 @ 12:35 pm

  17. Hola Andres.

    Mi mail lo puedes encontrar en la seccion About del blog, puedes mandarme el wsdl y le echo un vistazo a ese warning. Pero no prometo nada, durante este mes voy a estar liadisimo con viajes de un lado para otro y no me va a sobrar el tiempo libre.

    El wsdl2java de Axis2 a mi ya me peto con algunos wsdls que tenia de anteriores desarrollos, esta muy verde aun. Te recomiendo:
    1) Bajate la version 1.3 tanto del Axis2 como del plugin y repite el proceso.
    2) Comenta tu problema en los foros de Axis2, sube el wsdl como ejemplo de caso donde peta el wsdl2java (bug)
    3) Prueba otro wsdl2java con tu wsdl, tal vez el de Axis1, Xfire o Glassfish (bajate el ultimo netbeans con el pack j2ee para este último).

    Por cierto, donde curras?

    Un saludo.

    Comment by Administrator — September 9, 2007 @ 12:05 pm

  18. Hola Julio

    He tenido bastantes problemas con tu tutorial… soy principiante, pero realmente lo que mas me acongoja es que a la hora de convertir el Wdsl a Java, las clases no me compilan debido a que no encuentran este paquete:
    org.apache.axis2.databinding

    Sabes algo al respecto? Gracias de antemano.

    Comment by Cesar Jacinto — September 12, 2007 @ 12:44 am

  19. Buenas Julio.

    Ante todo darte las gracias por este tutorial, me ha servido de mucha ayuda.

    Tengo un problema a la hora de realizar el build del código. Parece que a mi tampoco me encuentra el paquete databinding o algo así.

    Sin embargo, he comprobado manualmente que realmente existe en axis2-1.3.jar, así que no entiendo el problema que me está dando.

    Buildfile: D:WorkspacePruebamyVirtualShopbuild.xml
    init:
    pre.compile.test:
    [echo] Stax Availability= true
    [echo] Axis2 Availability= true
    compile.src:
    [javac] Compiling 23 source files to D:WorkspacePruebamyVirtualShopbuildclasses
    [javac] D:WorkspacePruebamyVirtualShopsrcorgexamplemyvirtualshopwsmessagesGetOrderStateRequest.java:90: cannot resolve symbol
    [javac] symbol : class ADBException
    [javac] location: package databinding
    [javac] final org.apache.axiom.om.OMFactory factory) throws org.apache.axis2.databinding.ADBException{
    [javac] ^
    [javac] D:WorkspacePruebamyVirtualShopsrcorgexamplemyvirtualshopwsmessagesGetOrderStateRequest.java:110: package org.apache.axis2.databinding.utils.writer does not exist
    [javac] org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter)
    [javac] ^
    [javac] D:WorkspacePruebamyVirtualShopsrcorgexamplemyvirtualshopwsmessagesGetOrderStateRequest.java:111: cannot resolve symbol
    [javac] symbol : class ADBException
    [javac] location: package databinding
    [javac] throws javax.xml.stream.XMLStreamException, org.apache.axis2.databinding.ADBException{
    [javac] ^

    …..
    [javac] D:WorkspacePruebamyVirtualShopsrcorgexamplemyvirtualshopwsmessagesGetOrderStateResponse.java:406: cannot resolve symbol
    [javac] symbol : class ADBException
    [javac] location: package databinding
    [javac] throw new org.apache.axis2.databinding.ADBException(”estado cannot be null!!”);
    [javac] ^
    [javac] D:WorkspacePruebamyVirtualShopsrcorgexamplemyvirtualshopwsmessagesGetOrderStateResponse.java:415: cannot resolve symbol
    [javac] symbol : class ADBException
    [javac] location: package databinding
    [javac] throw new org.apache.axis2.databinding.ADBException(”fechaPrevistaEntrega cannot be null!!”);
    [javac] ^
    [javac] 100 errors

    BUILD FAILED
    D:WorkspacePruebamyVirtualShopbuild.xml:43: Compile failed; see the compiler error output for details.

    Total time: 2 seconds

    Te suena de algo, Gracias.

    Comment by Jorge — September 12, 2007 @ 8:00 pm

  20. Julio

    Ya pude compilar las clases, el problema es que tu en el tutorial pones que bajemos el Axis2 1.2 y el requerido es el 1.3. Con eso ya podemos compilar el wsdl.

    Comment by Cesar Jacinto — September 12, 2007 @ 11:06 pm

  21. Hola Julio.

    Ayer te envié por correo electrónco la documentación con el wsdl (dentro del proyecto de eclipse). Por favor comentame algo al respecto.He intentado ser lo más explicito posible para que no te tome tiempo.

    Supongo que lo habrás recibido, he cogido la dirección del Blog.

    Gracias.

    Comment by Andres — September 13, 2007 @ 12:18 pm

  22. Gracias Cesar, tenias razón el problema era de las versiones del axis2, ya he podido compilar el código, tenia instalado el plugin para eclipse AXIS2-1.3 y en la version completa tenía AXIS2-1.2, las he igualado y listo.

    Debería de haber prestado más atención a las versiones.

    Muchas gracias a todos.

    Comment by Jorge — September 13, 2007 @ 5:56 pm

  23. Hola a todos.

    En efecto, hay que cuidar que la versión del plugin sea la misma que la del Axis2 que vais a usar. Pero el wsdl es válido y los pasos son los mismos independientemente de la versión.

    Lo único que si quereis usar las clases de ejemplo al seguir el tutorial, debereis hacer unas minimas modificaciones para que compile si usais la version 1.2 de Axis2 por culpa de los sufijos aleatorios _typeXX de las clases databinding. En la 1.3 parece que siempre te pone _type0 (parece).

    Lo que no entiendo es por qué directamente no eliminan el prefijo, sobretodo cuando en Axis1 esto funcionaba al pelo.

    Un saludo.

    Comment by Administrator — September 13, 2007 @ 7:01 pm

  24. Gracias por el tutorial me ha ayudado mucho, he seguido casi todo tutorial menos en que he creado los ficheros java directamente con el script de axis2 y que he creado un proyecto web en lugar de un proyecto Java. El fichero mock no puedo descargarmelo y he programado la operacion directamente en el fichero Skeleton y cuando he ejecutado el cliente me daba un Axis Fault. ¿Sabes cual es mi problema? Gracias.

    Comment by Fátima — September 21, 2007 @ 10:54 am

  25. Hola, otra vez. Cuando abro el servidor me pone lo siguiente:
    The endpoint reference (EPR) for the Operation not found is /axis2/services/mywebservice and the WSA Action = null
    Gracias

    Comment by Fátima — September 21, 2007 @ 11:24 am

  26. Hola Fatima.

    Muchas gracias por tu interés. Desgraciadamente no entiendo muy bien tu error, es al ejecutar el axis2server? Has comparado tu wsdl con el del tutorial? De primeras la url /axis2/services/mywebservice no parece ser la misma que la del tutorial, compruebalo.

    Siento no poder serte de má ayuda, así de primeras.

    Un saludo.

    Comment by Administrator — September 25, 2007 @ 11:21 pm

  27. Hola, primero, muchas gracias por los articulos de tu blog que me han ayudado bastante en esto de axis2. Aún no sigo este tutorial, porque tengo una duda previa,¿al empaquetar el WS se incluyen en el archivo .aar, los .jar de axis2?, y si es asi, ¿sabes si existe alguna forma de que esto no suceda? la idea seria no tener las librerias en el servidor por cada WS que suba. Espero se entienda mi pregunta.

    Saludos

    Comment by Edgardo — October 1, 2007 @ 4:43 pm

  28. Hola Julio.
    He probado el cliente con AXIS2 1.3 tanto del motor como del plugin para Eclipse. La parte servidora parece que va bien (porque no veo nada que me diga lo contrario, el servicio esta desplegado) pero cuando ejecuto el Test visualiza lo siguiente:
    log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
    log4j:WARN Please initialize the log4j system properly.
    *** Stub creado para endpoint = http://localhost:8080/axis2/services/myVirtualShop

    *** Invocando operacion GetCatalog…
    Exception in thread “main” org.apache.axis2.AxisFault: Please implement org.example.www.myvirtualshop.wsdl.MyVirtualShopSkeleton#getCatalog
    at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:486)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:343)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:389)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:211)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
    at org.example.myvirtualshop.wsclient.MyVirtualShopStub.getCatalog(MyVirtualShopStub.java:205)
    at org.example.myvirtualshop.wsclient.TestClient.main(TestClient.java:29)

    Saludos.

    Comment by Andres Ortega — October 2, 2007 @ 11:52 am

  29. Hola Julio. He cambiado la clase mock para que delege en ella los metodos. Pero ahora me da el siguiente error:

    log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
    log4j:WARN Please initialize the log4j system properly.
    *** Stub creado para endpoint = http://localhost:8080/axis2/services/myVirtualShop

    *** Invocando operacion GetCatalog…
    Exception in thread “main” org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:417)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:89)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:326)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:389)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:211)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
    at org.example.myvirtualshop.wsclient.MyVirtualShopStub.getCatalog(MyVirtualShopStub.java:205)
    at org.example.myvirtualshop.wsclient.TestClient.main(TestClient.java:29)
    Caused by: java.lang.NullPointerException
    at org.apache.axis2.transport.TransportUtils.createDocumentElement(TransportUtils.java:156)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:111)
    at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:87)
    … 6 more

    Alguna sugerencia…..

    Gracias.

    Comment by Andres Ortega — October 2, 2007 @ 6:17 pm

  30. Hola Edgardo.

    Puedes ver Axis2 como un servidor en si mismo. Puede ejecutarse por si solo o como una aplicacion web de cualquier contenedor de servlets, pej tomcat.

    Al ser un servidor puedes poner en su carpeta lib todas aquellas librerias que quieras que sean compartidas por todos los webservices que van a ser desplegados. De este modo en el fichero aar sólo van las clases que tu desarrolles para el webservice, como un jar cualquiera.

    Espero haberte ayudado, muchas gracias por tus comentarios y un saludo.

    Comment by Administrator — October 5, 2007 @ 6:21 pm

  31. Andres, no entiendo nada. La clase mock no delega en nadie, es al reves. De todas formas te esta saltando un nullpointer en el código del cliente.

    Comment by Administrator — October 5, 2007 @ 6:23 pm

  32. hola! primero ke nada gracias por el artíkulo! está muy bueno.. pero tengo un problema, kuando genero las klases kon el axis wizzard del eclipse, en algunas klases keda la sgte línea de kódigo:

    org.apache.axiom.om.OMDataSource dataSource = new org.apache.axis2.databinding.ADBDataSource(
    this, parentQName) {

    public void serialize(javax.xml.stream.XMLStreamWriter xmlWriter)
    throws javax.xml.stream.XMLStreamException {

    // We can safely assume an element has only one type associated
    // with it

    if (localSaludarRequest == null) {
    throw new RuntimeException(”Property cannot be null!”);
    }
    localSaludarRequest.getOMDataSource(MY_QNAME, factory)
    .serialize(xmlWriter);

    }

    me da este error:

    The type new ADBDataSource(){} must implement the inherited abstract method ADBDataSource.serialize(MTOMAwareXMLStreamWriter)

    alguna sugerencia???

    gracias de antemano!!

    Comment by gabriel — October 8, 2007 @ 4:20 pm

  33. Hola Gabriel.

    Nunca me salio ese error ¿Has mirado que tienes la misma version de Axis2 tanto en el plugin de eclipse como en el Axis2 server que has instalado?

    Un saludo y gracias por tus comentarios.

    Comment by Administrator — October 8, 2007 @ 6:55 pm

  34. Quería darta las gracias por tu tutorial, lo he seguido y finalmente he conseguido que funcione, tuve problemas con las versiones de plugin y la distribución binaria de axis2 ya que eran distintas, pero ya lo solucioné. Gracias por tu contribución y un saludo!

    Comment by Mar — October 30, 2007 @ 8:01 pm

  35. Hola!

    Enhorabuena por tu artículo. Lo estaba siguiendo con atención y sin problemas pero me he quedado atascado a la hora de instalar el schema final. Parece que blogsome ha borrado el schema y el resto de ficheros. ¿Te importaría colgarlos de nuevos, o mejor aún, mandármelos por correo?

    Mi correo es keldornl@gmail.com.

    Gracias

    Comment by Pedro — November 15, 2007 @ 10:44 pm

  36. Hola Pedo.

    Muchas gracias por tu comentario. He probado los enlaces y funcionan, debio ser un problema temporal… Aun así te los envio a la direccion que me has dado.
    Si tienes cualquier otro problema me dices.

    Un saludo.

    Comment by jcesarperez — November 18, 2007 @ 2:19 pm

  37. Hola a todos.

    He puesto los ficheros del XSD y el WSDL en box.net por si teneis algun problema a la hora de bajarlos.

    Un saludo

    Comment by jcesarperez — November 18, 2007 @ 2:26 pm

  38. Hola a todos!!! gracias a este tutorial aprendi y afiance conceptos sobre axis2, asi q enhorabuena al autor!
    ahora tengo un problema, necesito enviar un archivo xml desde el servidor al cliente, y el cliente debe mostrarlo, este archivo se encuentra en el disco duro del servidor, alguien podria echarme una mano???? es que no he encontrado informacion en el red acerca de este tipo de envios.
    muchisimas gracias de nuevo!
    Sonia

    Comment by Sonia — November 26, 2007 @ 10:41 am

  39. Hola Sonia.

    Te paso un enlace que me mando por correo otro visitante que creo es justo lo que necesitas: http://wso2.org/library/1675 Espero que se te de bien el inglés… el resto es fácil.

    Un saludo.

    Comment by jcesarperez — November 26, 2007 @ 8:46 pm

  40. Buenas Julio. Enhorabuena por el trabajo, y muchas gracias. Llevo días pegandome con los WebServices y me has arrojado mucha luz.

    Esperaba q pudieras echarme un cable con un problema q me ha surgido al tirar mi web service. Te cuento: he seguido tu tutorial paso a paso y no he tenido ningún problema, pero x lo q veo, en cada llamada encapsulas en un objeto todos los parámetros q le envias al servicio (al igual q haces con la respuesta). En mi caso, tengo q poner en servicio una clase que ya está hecha y dando servicio (aunq no todavía como webService), x lo q, como te puedes imaginar, no puedo tocarla alegremente. De echo ni siquiera tengo acceso al codigo fuente, sólo al class. Así q necesito mandarle los parámetros sin encapsular, es decir hacer una llamada del tipo

    crearAveria(Integer idAveria, Date fechaCreacion, String descripcion), y q me devuelva un objeto WS_Respuesta, que es un bean, que contiene un OK (true o false) y el idAveria.

    Para ello, me he creado un xsd que contiene la definición del WS_Respuesta:

    y en el wsdl, los msg q intercambio me quedan así:

    Al pasar el code generator sobre el wsdl se produce un error porque “crearAveriaRequest tiene más de una parte”

    Cómo puedo solucionar esto?? Voy por mal camino??

    Muchas gracias y un saludo.

    Comment by Javierito — January 31, 2008 @ 12:12 pm

  41. Ok, parece que el editor se ha comido los tags de XML. te los pongo aquí otra vez sin formatear. Perdona:

    El XSD:

    element name=”WS_Respuesta”
    complexType
    sequence
    element name=”OK” type=”boolean” /
    element name=”idAveria” type=”integer”/
    /sequence
    /complexType
    /element

    Los msgs del WSDL:

    wsdl:message name=”crearAveriaRequest”
    wsdl:part name=”idAveria” type=”xsd:integer”/
    wsdl:part name=”descripcion” type=”xsd:string”/
    wsdl:part name=”fechaApertura” type=”xsd:date”/
    /wsdl:message

    wsdl:message name=”crearAveriaResponse”
    wsdl:part element=”xsd1:WS_Respuesta” name=”crearAveriaReturn” /
    /wsdl:message

    Comment by Javierito — January 31, 2008 @ 12:21 pm

  42. Necesito un poco de ayuda.
    He llegado hasta la parte final, pero no puedo montar el aar.
    Al ejectuar ant, aparentemetne no sucede nada, ni la creación de los directorios.
    Mirando el error log, me dice:
    Error logged from Ant UI:
    y la descripción:
    java.net.SocketTimeoutException: Accept timed out
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at org.eclipse.ant.internal.ui.launchConfigurations.RemoteAntBuildListener$ServerConnection.run(RemoteAntBuildListener.java:95)

    Las rutas de Ant son correctas, me he actualizado eclipse por si acaso, pero nada de nada.
    Sabes cual puede ser el problema? Muchas gracias

    Comment by Carlos — February 7, 2008 @ 1:55 pm

  43. Execelente post.
    Hace poco he empezado a trabajar con Axis2 y uno de los principales problemas con los que me estoy encontrando es la falta de documentación. Incluso la documentación de Apache me parece bastante pobre.
    Sí que se encuentran tutoriales sobre cómo construir un servicio simple que devuelve un string. Pero para otros aspectos un poco más avanzados, pero que son necesarios en cualquier servicio medianamente complejo (serialización de objetos propios, utilización de cabeceras SOAP personalizadas, etc.), no encuentro una documentación de referencia que me diga cómo hacerlo de forma clara.
    ¿Alguien conoce una buena fuente de documentación (webs, libros, o lo que sea) para trabajar con Axis2?
    Gracias.

    Comment by Daniel — March 6, 2008 @ 10:22 am

  44. Hola Julio,

    Antetodo felicitarte por tus posts acerca de los web services. He de comentarte que me he leído los tres y he aprendido mucho. Quería preguntarte si es posible desarrollar un cliente teniendo únicamente el archivo wsdl sin tener el schema .xsd. O si es posible generar el schema a partir del descriptor wsdl.

    Un saludo y muchas gracias

    Comment by Samuel — April 4, 2008 @ 10:40 am

  45. Hola Samuel.

    Me alegro mucho que te hayan sido de utilidad.
    Normalmente el wsdl lleva embebido el xsd, sobretodo si se ha hecho de forma automatica. Y si no lo lleva, llevará una referencia a donde poder localizarlo. Por lo general los xsd suelen estar publicados en algun servidor del proveedor.

    Y a las malas puedes usar la URL del endpoint del servicio seguida de ?wsdl para indicarle al wsdl2java donde esta el wsdl y que te genere el codigo del cliente.

    Un saludo para ti tambien.

    Comment by jcesarperez — April 4, 2008 @ 12:02 pm

  46. Hola.
    Como veo que conoces muy bien los web services de Axis y yo no, espero que me puedas ayudar. El problema consiste en que tengo que crear el proxy en C# empleando el fichero WSDL generado a partir de un servidor Axis y al usar la herramienta WSDL.EXE muestra el siguiente mensaje de error:

    Advertencia: Esta referencia Web no cumple con WS-I Basic Profile v1.1.
    R2706: Un elemento wsdl:binding en una DESCRIPCIÓN DEBE utilizar el valor
    “literal” para el atributo use en todos los elementos soapbind:body, soapbind:fault,
    soapbind:header y soapbind:headerfault.

    Esta incidencia nos impide generar el proxy. Parece ser que esta relacionado con problemas de interoperabilidad.
    ¿Sabes si existe alguna posibilidad de generar un WSDL interoperable con .NET a partir del WSDL original o deberia exigir otro WSDL con una estructura interoperable (yo soy el cliente y no tengo acceso al desarrollo del WS del servidor) ?

    Muchas gracias por todo…

    Comment by Andrés — April 18, 2008 @ 1:31 pm

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



Anti-spam measure: please retype the above text into the box provided.


Captcha anti-spam