Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/07/2013, 15:33
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Cliente Axis 1.2 para consumir WS Axis 2

Hola a Todos los forista:

Después de unos días de descanso, he vuelto a la batalla con los WebServices y las distintas formas de consumirlos.

Hace algunos días publiqué una pregunta que quedó sin respuesta y sigo haciendo pruebas:

http://www.forosdelweb.com/f45/como-...r-10g-1060097/

Ahora estoy en lugar de utilizar JAX-WS estoy tratando de consumir un cliente generado con Axis 2...

Les explico nuevamente cuál es el problema y a continuación planteo lo que he investigado. Actualmente tenemos publicados varios servicios web con Axis 1.4, pero estamos haciendo la migración hacia JAX-WS o Axis 2... sin embargo el problema que tenemos no es en realidad con el WS, sino con los clientes que tenemos... dichos clientes están basados en Axis 1, y básicamente lo hacen de esta manera:

Código Java:
Ver original
  1. package clientews;
  2.  
  3. import org.apache.axis.client.Call;
  4. import org.apache.axis.client.Service;
  5.  
  6. public class cliente {
  7.     public cliente() {
  8.     }
  9.    
  10.     public static String consumir(Object[] parametros){
  11.         String regresar = null;
  12.         Service service = null;    
  13.         Call call       = null;
  14.         String endpoint = null;
  15.         try {
  16.           endpoint = "http://localhost:8084/HolaMundo/HolaMundo";          
  17.           service = new Service();
  18.           call = (Call) service.createCall();
  19.           call.setTargetEndpointAddress(new java.net.URL(endpoint));
  20.           call.setOperationName("hello");          
  21.           regresar=String.valueOf(call.invoke(parametros));          
  22.         }// try
  23.         catch (Exception e) {
  24.           e.printStackTrace();
  25.         }// catch
  26.         finally {
  27.           return regresar;
  28.         }// finally
  29.       }
  30.  
  31.     public static void main(String[] args) {
  32.         try {            
  33.             String parametro = "José";
  34.             String respuesta = consumir(new Object[]{parametro});
  35.             System.out.println("respuesta: --->" + respuesta);
  36.         } catch (Exception e) {
  37.             System.err.println(e.toString());
  38.         }
  39.     }
  40. }

Ahora, la teoría dice que cualquier cliente debería de consumir cualquier WS, (al menos eso es lo que tengo entendido) sin embargo, al cambiar la URL del endpoint y colocar la del WS en Axis2 o en JAX-WS no se invoca y marca error...

Ahora bien, investigando un poco, encontré que el problema está con el namespace del WSDL que se genera, sin embargo no he encontrado una manera de modificar este archivo WSDL para que el cliente no tenga que hacer cambios... navegando por la red encontré esta página:

http://axis.apache.org/axis2/java/co...migration.html

Y veo noté que aunque es prácticamente la misma forma de invocar el WS que puse arriba, si tiene una pequeña diferencia:

Código Java:
Ver original
  1. call.setOperationName(new QName("http://soapinterop.org/", "echoString"));

En esta línea, el namspace se declara en el constructor del objeto QName...

Haciendo este cambio, el Cliente funciona correctamente. Sin embargo no es factible que le pidamos a nuestros clientes que hagan cambios en sus páginas, sino que lo ideal es poder configurar el WS para que funciones sin problemas...

el archivo WSDL del WS que estoy probando dice lo siguiente:

Código XML:
Ver original
  1. <wsdl:definitions
  2. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  3. xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://calculadora.es"
  4. xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
  5. xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
  6. xmlns:xs="http://www.w3.org/2001/XMLSchema"
  7. xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
  8. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  9. xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
  10. targetNamespace="http://calculadora.es">

Si observan, el targetNamespace está como

Código:
targetNamespace="http://calculadora.es"
En mi cliente, cuando pongo esto:

Código MySQL:
Ver original
  1. call.setOperationName("saludar");

La aplicación marca el siguiente error:

Código:
namespace mismatch require http://calculadora.es found none
Cuando lo hago así:

Código Java:
Ver original
  1. call.setOperationName(new QName("http://calculadora.es", "saludar"));

El cliente funciona perfectamente...

Ahora bien, no es factible que le pida a todos los clientes que modifiquen la forma en que invocan los ws con Axis 1.4 para incluir el namespace que hace referencia el archivo WSDL... entonces después de tanto rollo finalmente la pregunta...

¿cómo puedo modificar mi archivo WSDL para que no me marque este error y no tener que pedirle a los clientes que modifiquen esta línea de código, es decir, que tome por defecto el namespace que viene definido?

De antemano muchísimas gracias por el apoyo.

Saludos
Leo.