Buscar
Social
Ofertas laborales ES

Foro sobre Java EE > Cliente SOAP con Axis2

Buenas,
Tengo un problema generando un cliente java a partir de un wsdl. En realidad, el cliente java se genera bien y funciona perfectamente, el tema está en que el .java generado tiene harcodeado el targetNamespace por todos lados.
Esto es un problema ya que, si bien funciona en el entorno de desarrollo, deja de funcionar cuando lo apuntamos a otro server, el cual genera un wsdl identico pero con otro namespace.
Debido a que tenemos como limitación usar java 1.4, lo ideal es seguir usando Axis2/adb.
Busqué por todos lados y no puedo encontrar la manera de evitar esto.. Aguna idea?

Muchas gracias!
Saludos

febrero 13, 2015 | Unregistered CommenterNacho

Dime como generas el cliente y que estás usando para hacerlo.

febrero 16, 2015 | Registered Commenterantuansoft

Se me ocurre que generes el cliente tomando el WSDL del otro servidor, debería de funcionar ya que pillará el namespace correcto. Pero no me parece lógico que el Servidor de desarrollo tenga distinto namespace de el de el otro servidor!!!. Pero si es así genera el cliente contra el WSDL de ese servidor, deber de ser compatible.

Si no funciona, lo que te digo en el anterior post

Dime como generas el cliente y que estás usando para hacerlo.....y pon el WSDL si puedes.

febrero 16, 2015 | Registered Commenterantuansoft

Hola, muchas gracias por responder!
En primer lugar, así es como genero los clientes con axis2:

wsdl2java -uri BillingWebService.wsdl -d adb -s -o build\client

Por otro lado, cuando instancio el cliente con una nueva ip, éste envía la petición y recibe la respuesta, pero lanza una excepción al intentar armar el objeto de respuesta debido a que el namespace no es el mismo.
Este es un fragmento del código generado con axis:

reader.next();
while (!reader.isStartElement() && !reader.isEndElement())
reader.next();
if (reader.isStartElement()
&& new javax.xml.namespace.QName(
"http://spod3150.sp01.local:12348/","PAYPRESALERESULT")
.equals(reader.getName())) {
object.setPAYPRESALERESULT(STNSRET.Factory.parse(reader));
reader.next();
} // End of if for expected property start element
else { }

while (!reader.isStartElement() && !reader.isEndElement())
reader.next();

if (reader.isStartElement())
// A start element we are not expecting indicates a trailing invalid property
throw new org.apache.axis2.databinding.ADBException(
"Unexpected subelement " + reader.getLocalName());

El namespace que figura en el código ("http://spod3150.sp01.local:12348/") es el que targetNamespace que del wsdl del server de desarrollo. La excepción que recibo en este es caso es "Unexpected subelement PAYPRESALERESULT".
Lamentablemente, en este momento no tengo un wsdl para adjuntar. Si es necesario puedo postearlo mañana.

Gracias y saludos!

febrero 17, 2015 | Unregistered CommenterNacho

Se me ocurren dos cosas que te pueden pasar, te las cuento:

1 - Por el error que pones me da la sensación de que los WSDL de las dos máquinas no son iguales o el cliente que tienes generado está basado en WSDL antiguo (no actualizado al último WSDL del servidor) y te da el error de "Unexpected subelement".

he mirado el error en google y me dice que "the message received by the receiver contained an XML element that the receiver wasn't expecting." O sea que al cliente le llega un XML de respuesta que no conoce.

http://stackoverflow.com/questions/16565647/adbexception-unexpected-subelement

Para solucionarlo genera de nuevo tu cliente y impórtalo en tu proyecto y vuelve a llamar a ver que pasa.

2 - No estarás confundiendo NameSpace con EndPoint. Yo tengo mis servicios AXIS2 generados y subidos en varios servidores WSO2 y su WSDL es exactamente el mismo y lo único que cambia es el endPoint que en el fondo es el servidor donde está alojado:
compara los tuyos.
Ejemplo (lo único que debería cambiar en el nombre de la máquina y/o puerto):


<wsdl:port name="SOAP11Endpoint" binding="ns0:MiServicioSOAP11Binding"><soap:address location="http://maquina1:9763/services/MiServicio.SOAP11Endpoint/"/></wsdl:port>
......
.....etc

Si los WSDL de las máquinas son los mismos (excepto los end points) y tu cliente se ha generado en base a ellos (lo te pongo en el punto 1), debería de dar igual a que servidor apuntes para llamara a tu servicio que debería de funcionar igual.

Ahora bien para llamar a un servidor u otro no se cambiar el NameSpace se cambia el EndPoint. De hecho el NameSpace tiene que ser exáctamente le mismo en los dos sino lo es algo no cuadra. ¿Como comprobamos el nameSpace? también lo tienes en el WSDL

Ejemplo Busca targetNameSpace en tu WSDL :


<wsdl:definitions targetNamespace="http://ws.wso2.org/dataservice"><wsdl:documentation/><wsdl:types><xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://ws.wso2.org/dataservice">
........

Viendo tu llamada en el código veo que en lo que tu llamas NameSpace a mi me parece que estás poniendo un EndPoint (una URL con puerto donde atacar, en vez de un espacio de nombres).

javax.xml.namespace.QName(
"http://spod3150.sp01.local:12348/","PAYPRESALERESULT")

¿Y como cambiamos el EndPoint? Te pongo un ejemplo de como hago una llamada a un servicio de los míos con ADB. Que no se parece a la tuya ya que el nameSpace es igual siempre.

Voy a hacer una llamada al WS MiServicio a la operacion operacion1 (que recibe 2 string y devuelve un string) apuntando a la máquina1 que donde está el WSDL de este servicio.
El NameSpace siempre el mismo: http://ws.wso2.org/dataservice

Si quiero llamar a otra máquina lo que cambia es el endpoint o sea la url con el WSDL.


@Test
public void clientTest() throws Exception{

QName serviceName = new QName("http://ws.wso2.org/dataservice", "MiServicio");
URL url = new URL("http://maquina1:9763/services/MiServicio?wsdl");
MiServicio stub = new MiServicio(url, serviceName);

MiServicioPortType portType = stub.getSOAP11Endpoint();

String result = portType.operacion1("1433687", "0001");
}

Nota: El código generado para hace el cliente no es necesario modificarlo sólo tienes que usarlo para llamar al endPoint que quieres como he hecho yo.

Espero que te sirva de ayuda. Sino necesitamos tu WSDL y como haces la llamada al servicio usando el cliente generado.

Un Saludo.

febrero 18, 2015 | Registered Commenterantuansoft