Desarrollar un cliente webservice desde WSDL en Axis2

August 26, 2007

En esta ocasión, y como paso lógico después de ver cómo desarrollar un webservice, voy a contar cómo construir un cliente para invocar un webservice utilizando WSDL2Java en Axis2.

El webservice al que invocará el cliente es el desarrollado en el artículo anterior, myVirtualShop. Puedes descargarlo aquí listo para desplegar en el repositorio de Axis2.

Preliminares
Si deseas seguir este tutorial paso a paso debes tener instalado:

  • JDK 1.4 o superior, con la variable de entorno JAVA_HOME configurada.
  • Eclipse 3.1 o superior. Con el plugin Code Generator Wizard de Axis2 instalado (sólo hay que copiarlo a plugins antes de arrancar Eclipse).
  • Axis2 1.2 Standard Binary Distribution o superior. No olvides configurar la variable de entorno AXIS2_HOME. Si necesitas ayuda para instalar Axis2 puedes consultar el artículo anterior Instalando Axis2.
  • Por mi parte he aprovechado para probar la nueva versión 1.3 de Axis2. En teoría sólo mejora el rendimiento y corrije algunos bugs. Con la 1.2 funciona igual.

    En qué consiste
    Crear un cliente webservice utilizando la herramienta WSDL2Java es realmente sencillo, sólo necesitas tener acceso al WSDL que describe el webservice y ejecutar el WSDL2Java para generar las clases Java correspondientes al cliente.

    Antes de
    Antes de nada vamos a dejar el webservice desplegado y funcionando. Copia el webservice myVirtualShop.aar al repositorio de Axis2, subcarpeta services, y arranca el servidor con el script axis2server localizado en bin. Comprueba que todo está correcto accediendo al endpoint del webservice en http://localhost:8080/axis2/services/myVirtualShop.

    Ahora con el webservice funcionando podemos centrarnos exclusivamente en el cliente. Lo primero es crear un nuevo proyecto Java, myVirtualShopClient, y configurar su Build Path para añadir los jars de Axis2, localizados en lib. Para independizar al proyecto cliente de la instalación de Axis2 crea una carpeta lib y copia dentro los jars de Axis2. Seleccionalos todos y añadelos al Build Path. Sé que son muchos y que algunos no hacen falta, pero otros dependen de determinadas decisiones que se tomen durante el desarrollo, como la elección del Databinding a utilizar, de si queremos hacer llamadas asíncronas, enviar attachments, etc. Mi recomendación es tenerlos todos disponibles durante el desarrollo y eliminar los jars innecesarios al crear la distribución.

    Lo siguiente es añadir al proyecto el WSDL del webservice y sus schemas asociados. Crea una carpeta resources y copia dentro el WSDL y su schema. Recuerda borrar las extensiones jpg. A continuación un screenshot de como queda el proyecto.

    Momento WSDL2Java
    En este punto ya podemos utilizar WSDL2Java para generar de forma automática el código Java para el cliente webservice a partir del fichero WSDL. El código generado incluye un stub cliente para invocar al webservice y las clases Java necesarias para el Databinding de los mensajes XML. Como motor de Databinding vamos a usar adb.

    Para ejecutar WSDL2Java se puede optar por hacerlo mediante una consola, ANT, Maven o un plugin de Eclipse o IDEA. Nosotros vamos a ver cómo usar el plugin de Eclipse Code Generator Wizard. Es más fácil y descriptivo:

    1. Pulsa File->New->Other->Axis2 Wizards->Axis2 Code Generator.
    2. Elije la opción de generar código Java desde un fichero WSDL. Pulsa Next.
    3. Selecciona el fichero myVirtualShop.wsdl localizado en resources. Pulsa Next.
    4. En la pantalla de opciones, selecciona custom como Codegen option e indica org.example.myvirtualshop.wsclient como Custom package name. Fijate que dejamos adb como Databinding y que se va a generar código cliente, tanto para llamadas síncronas como asíncronas. Pulsa Next.
    5. Finalmente selecciona el proyecto myVirtualShopClient como destino del código a generar. Para ello elije la primera opción y elije el proyecto al pulsar el botón Browse. Pulsa Finish.

    En las siguientes imágenes se ilustran los pasos anteriores.

    wsdl2java client - paso 1wsdl2java client - paso 2wsdl2java client - paso 3wsdl2java client - paso 4wsdl2java client - paso 5

    Si refrescas el proyecto podrás ver las clases creadas en el nuevo package org.example.myvirtualshop.wsclient:

    • MyVirtualShopStub: Esta es la clase stub cliente con la que se pueden invocar las operaciones del webservice. Contiene un método por cada operación del webservice y clases internas que representan los elementos de los mensajes XML (databinding). Además, y como hemos seleccionado el modo asíncrono durante el wsdl2java, existe un método, que empieza por start, para realizar cada operación del webservice de forma asíncrona.
    • MyVirtualShopCallbackHandler: Esta es una clase abstracta que representa el manejador de respuestas asíncronas. Su funcionamiento lo veremos más adelante.

    Despues de
    Con el cliente ya creado sólo falta incorporar el código Java necesario a nuestra aplicación para crear el mensaje de petición deseado, usar el stub para invocar la operación correspondiente y procesar la respuesta.

    Lo primero es crear una instancia del stub e indicar la URL del endpoint del webservice al que queremos invocar. Ejemplo:

    String sEndPoint = "http://localhost:8080/axis2/services/myVirtualShop";
    MyVirtualShopStub stub = new MyVirtualShopStub(sEndPoint);

    Construir un mensaje es muy fácil. Existe una clase interna (JavaBean) por cada elemento complejo del mensaje XML que se utiliza para realizar el databinding o mapeo entre objetos Java y XML (y viceversa). Por tanto no es más que ir creando objetos y usar metodos set. Para ver las clases internas puedes ayudarte de la vista Outline del propio Eclipse. Sorpresa! Los incomprensibles sufijos _typeX siguen sin desaparecer en la versión 1.3 de Axis2.

    Outline del stub

    El siguiente código es un ejemplo de cómo se construiría una petición para la operación Order:

    //Elemento raiz del mensaje
    OrderRequest orderRequest = new OrderRequest();
    //Elemento Cliente
    Cliente_type0 cliente = new Cliente_type0();
    cliente.setNombre("John Waterfall");
    cliente.setDireccion("NA");
    orderRequest.setCliente(cliente);
    //Elemento items
    Items_type0 items = new Items_type0();
    Item_type0[] aItem = new Item_type0[1];
    //Elemento item
    aItem[0] = new Item_type0();
    aItem[0].setRef("R0001");
    aItem[0].setCantidad(100);
    items.setItem(aItem);  
    orderRequest.setItems(items);

    Para invocar al webservice el stub cuenta con un método por cada operación. Los métodos son getCatalog, search, ordergetStateOrder. Estos métodos tienen como parámetro la clase que representa el mensaje petición de la operación y devuelven la correspondiente respuesta. Siguiendo con el ejemplo, lo siguiente sería el código para invocar la operación Order y procesar la respuesta:

    OrderResponse orderResponse = stub.order(orderRequest);
    System.out.println("** OrderResponse.getIdPedido() = " + orderResponse.getIdPedido());
    System.out.println("** OrderResponse.getFechaPrevistaEntrega() = " + orderResponse.getFechaPrevistaEntrega());
    System.out.println("** OrderResponse.getgetTotal() = " + orderResponse.getTotal());

    Si deseas ver un ejemplo un poco más completo dónde se invocan las cuatro operaciones del webservice, puedes descargarte la siguiente clase TestClient, copiarla al package org.example.myvirtualshop.wsclient y ejecutar su método main. Asegurate antes de que el webservice se encuentra desplegado y ten cuidado con los nombres de las clases internas del databinding, los números de los sufijos podrían variar.

    Modo asíncrono
    Una de las novedades de Axis2 es que permite realizar llamadas asíncronas sobre las operaciones de un webservice.

    ¿Qué diferencia hay entre una llamada síncrona y asíncrona? Cuando se invoca a un método de forma síncrona o bloqueante, el flujo de control del programa no sigue con la siguiente instrucción hasta que no termina la ejecución del método invocado (el 99.9% de las llamadas en Java). Mientras que cuando se invoca a un método de forma asíncrona o no bloqueante, el flujo de control del programa continua automáticamente con la siguiente instrucción y en otro thread se ejecuta el método invocado (concurrencia).

    Estas llamadas asíncronas forman el patrón de intercambio de mensajes (MEP) conocido por In-Only y es muy útil para invocar operaciones de las que no necesitamos una respuesta o no podemos disponer de la respuesta en ese mismo instante.

    Para invocar las operaciones del webservice de forma asíncrona el stub contiene un método por cada operación que se llama igual pero empezando por el prefijo start.  Los métodos son startGetCatalog, startSearch, startOrderstartGetStateOrder. Estos métodos tienen dos parametros, el mensaje de petición y el manejador de la respuesta asíncrona (CallbackHandler) que será el encargado de recibir la respuesta de la operación invocada.

    Para crear un CallbackHandler hay que usar, más bien heredar, la clase abstracta CallbackHandler generada por el wsdl2java. Esta clase tiene dos métodos por cada operación del webservice, uno para procesar la respuesta y otro para procesar un posible error en la comunicación. Por tanto habrá que sobreescribir el par de métodos correspondientes a la operación que se vaya a invocar de forma asíncrona con el código para procesar la respuesta de la operación o tratar un posible error.

    Veámoslo en detalle y siguiendo nuestro ejemplo para el webservice MyVirtualShop. Los pasos para poder invocar la operación Order de forma asíncrona serían los siguientes:

    1. Crea una clase que herede de la clase abstracta MyVirtualShopCallbackHandler, llámala OrderCallbackHandler. Aquí tienes su código.
    2. Sobreescribe el método receiveResultorder con el siguiente código de ejemplo para procesar la respuesta:

      public void receiveResultorder(OrderResponse result) {
       System.out.println("** Procesando respuesta asíncrona de operación Order…");
       System.out.println("** OrderResponse.getIdPedido() = " + result.getIdPedido());
       System.out.println("** OrderResponse.getFechaPrevistaEntrega() = " + result.getFechaPrevistaEntrega());
       System.out.println("** OrderResponse.getgetTotal() = " + result.getTotal());
       System.out.println("** Procesando respuesta asíncrona de operación Order… OK");
      }

    3. Sobreescribe el método receiveErrororder con el siguiente código de ejemplo para procesar un posible error:

      public void receiveErrororder(Exception e) {
       System.out.println("** Error en invocación asíncrona a operación Order…");
       e.printStackTrace();
       System.out.println("** Error en invocación asíncrona a operación Order… OK");
      }

    4. Crea una nueva clase, TestAsynClient, con un método main para probar la llamada asíncrona a la operación Order. Aquí tienes su código. El código para crear el stub y la petición es exactamente el mismo que en el ejemplo de más arriba. Sólo cambia el código para hacer la llamada, que sería el siguiente:

      System.out.println("\n*** Invocando operacion Order de forma ASÍNCRONA…");  
      OneCallbackHandler callback = new OneCallbackHandler();
      stub.startorder(orderRequest, callback);
      System.out.println("*** El flujo de control del programa continua con la siguiente instruccion a la llamada asíncrona\n");
      Thread.sleep(10000); //Espera 10s para que no termine el thread main y por tanto el programa sin recibir antes la respuesta

    5. Para probarlo ejecuta la clase recién creada. Si quieres probar el caso de receiveError sólo tienes que parar el Axis2 y volver a ejecutar la clase.

    Conclusiones
    Hasta aquí esto es todo. Como habeis visto usar un webservice con Axis2 es rápido y sencillo, pero con otras tecnologías el proceso es muy similar. Que el webservice haya sido creado también con Axis2 es irrelevante. Para crear un cliente sólo necesitamos el wsdl del servicio, es el único punto en común que tienen el cliente y el servicio. Pero, para evitar sorpresas en cuanto a la interoperabilidad se debe desarrollar el wsdl de forma independiente a una tecnología en concreto, sobretodo si es un wsdl complejo. Y a pesar de todo, la interoperabilidad 100% no se puede garantizar. Las sorpresas siempre están ahí, llámense bugs, attachments, estándares,…

    20 Comments »

    The URI to TrackBack this entry is: http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/trackback/

    1. 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:49 am

    2. Hola Andres.

      Tienes que implementar el metodo getCatalog en org.example.www.myvirtualshop.wsdl.MyVirtualShopSkeleton. Revisa el tutorial del webservice.

      Un saludo.

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

    3. Cuando hago clic en Finish del wizard me tira este error el eclipse:
      “An error ocurred while completing process -java.lang.InterruptedException: Encoded use is not suported”
      ¿Como puedo solucionarlo?

      Comment by Leandro — October 17, 2007 @ 2:04 pm

    4. Hola Leando.

      Nunca me dio ese error. ¿Qué versiones de Axis2, Axis2 Codegen plugin, Eclipse y Java estas usando?

      Comment by Administrator — October 17, 2007 @ 8:27 pm

    5. Hice un web service con el plugin de Eclipse Europa para Axis2, y del lado del cliente puse una consulta a una aplicación que tengo corriendo, y cuando trata de conectarse a la base de mi aplicación a través de la API me da este error del lado del lado del cliente:
      org.apache.axis2.AxisFault: org/pimslims/hibernate/ModelImpl
      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 experiments.GetExperimentsStub.getListElementForIntegration(GetExperimentsStub.java:156)
      at experiments.ClientExperiments.main(ClientExperiments.java:32)

      Comment by Ramiro — October 18, 2007 @ 4:01 am

    6. Hola Ramiro.

      Tiene toda la pinta de que la excepcion ocurre en el servidor y es un error de aplicacion, no de axis2.

      Comment by Administrator — October 19, 2007 @ 12:35 pm

    7. Hola, he estado revisando por toda la red temas de web service, y sigo sin encontrar una solución, si pueden ayudarme seria de lujo, el problema es el siguiente, tengo un web service con SOAP que tiene que ser invocado desde un CGI, pero no he encontrado como invocarlo.

      Podrian ayudarme?

      Comment by Humberto Balleza — January 9, 2008 @ 5:52 pm

    8. Hola Julio,

      Yo he seguido tus instrucciones al pie de la letra para construir un cliente y cuando ejecuto el código me dice:

      Exception in thread “main” org.apache.axis2.AxisFault: The service cannot be found for the endpoint reference (EPR) 127.0.0.1/axis2/services/myVirtualShop

      Si testeo esta URL en el navegador obtengo respuesta, pues he arrancado el servidor de axis para probar los servicios

      Sera una tonteria pero no lo veo

      un saludo y gracias por el articulo

      Comment by Gmanao — March 18, 2008 @ 6:40 pm

    9. Estas fijando el endpoint correctamente?

      String sEndPoint = “http://localhost:8080/axis2/services/myVirtualShop”;
      MyVirtualShopStub stub = new MyVirtualShopStub(sEndPoint);

      Me mosquea que en la URL que pones en tu msg no sale el puerto 8080

      Comment by Julio — March 18, 2008 @ 6:57 pm

    10. Hola.. Julio… espero y puedas ayudarme… primero te planteo la situacion y despues las preguntas…

      Lo que pasa es que tengo varios dias investigando sobre WebService y ya e logrado crear algunos sencillos y manejar Base de Datos y algunas funciones y metodos..

      El problema es el siguiente… lo anterior que ya e creado se ejecuta correctamente, muestra los datos que se deben de mostrar en el Main y todo lo demas… pero todo esto esta hecho en una sola “clase” y no tengo ningun problema al momento de crearla como WS… si no que el ahora.. tengo tres clases distintas… en donde a una clase(hace solamente la conexion a la BD) la instancio en el main de la Clases Principal… y la otra clase(donde se manejan todos los Datos) la heredo en la Clase Principal…. corre muy bien usandolo sin correrlo en Web Service… agrega sus campos, consultas , y todo lo demas…… pero al momento de hacerlo web service… y ejecuto el Main… no me muestra nada

      y creo yo que es porke no herada los metodos o algo esta mal…

      te agradeceria si me peudes ayudar con ese problema…

      gracias

      Comment by Sergio — May 19, 2008 @ 5:55 pm

    11. Hola Julio, tengo un pregunta.

      Primero, tengo un Sun One, donde tengo dos aplicaciones, una de ellas el el axis2 con un servico desplegado y funcionando,la otra es una aplicacion web java.

      Lo que quiero hacer es que desde la aplicacion java se llama al servicio web, esto me funciona. El servico web lo que hace es operaciones sobre la base de datos de la aplicacion java.

      El problema viene cuando el servico web, para unas determinadas entradas debe de llamar otra vez al servicio web para dar una repuesta, osea que se llama a si mismo, con parametros diferente pero nunca entra en un bucle.

      Se puede hacer esto?
      Puede un servicio web llamar a otro en medio de su logica???

      Comment by Alvaro Perea Hernandez — May 30, 2008 @ 11:04 pm

    12. Hola, está muy bien lo de crear el cliente a partir del WSDL con el asistente. ¿Sabéis de alguna forma sencilla de crear un cliente genérico para cualquier Web Service hecho con Axis 2?. Vamos, el poder invocar un WS de forma genérica, o tener un Stub genérico. Tengo el ejemplo que me convierte grados celsius a farenheit en el servidor, y me he vuelto loco para hacer una invocación manual, sin crear las clases con un asistente. A ver si alguien me puede echar una mano.

      Comment by Santi — June 2, 2008 @ 2:40 pm

    13. Hola, he intentado seguir los pasos que indicas en el articulo, y todo iba bien hasta que he tenido que generar las clases de la parte servidora, bueno y de la parte cliente con los plugin de eclipse…
      Cuando ya el he indicado el tema de los paquetes.. y comienza a crearlas salta un error que dice:
      -java.lang.reflect.InvocationTargetException

      el jdk que utilizo es el 1.6

      Sabes porque puede ser?
      Gracias

      Comment by Rosa Aguilar — June 5, 2008 @ 6:22 pm

    14. Tengo el mismo error de
      java.lang.reflect.InvocationTargetException
      al finalizar el wizard de Axis Codegen.

      Tengo eclipse 3.3.1.1 y el plugin de myeclipse 6.0.1-GA
      y el jdk1.5.0_06, corriendo en GNU/Linux (2.6.18-8.el5) CentOS 5.

      Al correr eclipse en modo debug , salta esta excepcion:
      java.lang.NoClassDefFoundError: javax/xml/stream/XMLStreamException
      at org.apache.axis2.context.ConfigurationContextFactory.createBasicConfigurationContext(ConfigurationContextFactory.java:315)
      at org.apache.axis2.context.ConfigurationContextFactory.createDefaultConfigurationContext(ConfigurationContextFactory.java:304)
      at org.apache.ws.java2wsdl.Java2WSDLBuilder.(Java2WSDLBuilder.java:101)
      at org.apache.ws.java2wsdl.Java2WSDLCodegenEngine.(Java2WSDLCodegenEngine.java:51)
      at org.apache.axis2.tool.codegen.eclipse.CodeGenWizard$2.execute(CodeGenWizard.java:434)
      at org.eclipse.ui.actions.WorkspaceModifyOperation$1.run(WorkspaceModifyOperation.java:101)
      at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1797)
      at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:113)
      at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:369)
      at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:313)
      at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:934)
      at org.apache.axis2.tool.codegen.eclipse.CodeGenWizard.doFinishJava2WSDL(CodeGenWizard.java:449)
      at org.apache.axis2.tool.codegen.eclipse.CodeGenWizard.performFinish(CodeGenWizard.java:174)
      at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:742)
      at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:373)
      at org.eclipse.jface.dialogs.Dialog$2.widgetSelected(Dialog.java:616)
      at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1101)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3319)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2971)
      at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
      at org.eclipse.jface.window.Window.open(Window.java:796)
      at org.eclipse.ui.actions.NewWizardAction.run(NewWizardAction.java:182)
      at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
      at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:546)
      at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:490)
      at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:402)
      at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
      at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1101)
      at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3319)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2971)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2389)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2353)
      at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2219)
      at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
      at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
      at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106)
      at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:169)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:508)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:447)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1173)

      Comment by Jose — June 26, 2008 @ 11:54 pm

    15. Me gustaria saber como autenticarse al web service.
      Quiero explotar un webservice creado en .NET pero hay que autenticarse y no se como hacerlo. Lo único que se es que el Web service maneja su autenticación con el xmlns:wsse=’http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd’”

      Salu2,

      Comment by Ricardo — August 1, 2008 @ 5:52 pm

    16. Julios, a mi me sucede que cuando hago clic en Finish del wizard me tira este error el eclipse:
      “An error ocurred while completing process -java.lang.InterruptedException: Encoded use is not suported”

      Comment by eduardo — September 15, 2008 @ 4:33 am

    17. Ya resolví, logre generar todos los artefactos (paquetes, schemas etc) que el axis2 genera a través de la linea de comandos, cosa rara que por la interfaz gráfica no lo lograr y por consola si :S. este es el comando:

      C:>wsdl2java -uri http://xxxxxxxx/?wsdl -p paquete.cliente -d xmlbeans -s

      luego de esto utilizo el ant que me genera el axis2 para empaquetar las clases que estan definidas en los schemas en un archivo .jar que debe estar disponible en la ruta build path

      Comment by eduardo — September 22, 2008 @ 4:24 pm

    18. Hola Julio

      En primer lugar quiero felicitarte por tu magnífico blog, ha sido de gran utilidad para el desarrollo de mi pfc.

      Tengo un problema con el stub generado, IncompatibleClassChangeError. La línea que indica dentro del stub es: _operationClient.getOptions().setAction(”http://localhost:8080/pfc/services/ConsultaListener/ConsultaListener/consultaRequest”);

      Estoy utilizando java 1.4.2, axis 2 v1.4, jboss 4.0.2… Todo se genera y se despliega bien, pero al hacer stub.startconsulta(request,manejadorConsulta); salta éso.

      Comment by Julio A. Ayala — November 26, 2008 @ 8:49 pm

    19. -java.lang.reflect.InvocationTargetException
      Este ocurre en el ultimo paso al tratar de generar el source.
      Tengo el code generador version 1.4.1
      java 1.6
      Eclipse 3.4.0

      Comment by Aaron — February 18, 2009 @ 5:11 am

    20. Buenas Julio.

      Estoy desarrollando un cliente para acceso a Web Service usando axis, y sólo tengo disponible el wsdl del servicio (no tengo el esquema).

      La invocación de los servicios todos reciben un sólo parámetro, menos uno de ellos que recibe una colección de parámetros (algunos de ellos array de String).

      Mi problema es el siguiente: al generar las clases java con axis (al no tener el esquema) no se me generan los beans para crear las peticiones, y sólo me aparecen métodos writeAttribute, writeQName y serialize.

      ¿Como puedo añadir los parámetros necesarios usando sólo esos métodos o necesito el esquema para que se generen los beans y poder acceder con los métodos set?

      Gracias y saludos.
      Jose.

      Comment by Jose Sierra — August 19, 2009 @ 5:51 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