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
package clientews; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class cliente { public cliente() { } Service service = null; Call call = null; try { endpoint = "http://localhost:8084/HolaMundo/HolaMundo"; service = new Service(); call = (Call) service.createCall(); call.setOperationName("hello"); }// try e.printStackTrace(); }// catch finally { return regresar; }// finally } try { } } }
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
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
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://calculadora.es" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://calculadora.es">
Si observan, el targetNamespace está como
Código:
En mi cliente, cuando pongo esto:targetNamespace="http://calculadora.es"
Código MySQL:
Ver original
La aplicación marca el siguiente error:
Código:
Cuando lo hago así:namespace mismatch require http://calculadora.es found none
Código Java:
Ver original
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.