style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

WS Axis 1.X consumir con JAX-WS

Hola chavos, que tal.
Tengo un pequeño problemita del cúal no logro salir:
Necesito consumir WS que fueron hechos en Axis 1.x, estos WS reciben como parametro un Objeto como tal, bueno así lo expone su XSD, dicho objeto es un xml envuelto en un mensaje Soap y da como respuesta otro mensaje Soap con su xml dentro, mas o menos así:

Objeto de envío

<SOAP-ENV:Envelope
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Body>
                <AltaClienteInfoRequest xmlns="http://xxx/Clientes/ws/schemas">
                        <uid>UID123456789012</uid>
                        <paisId>1</paisId>
                        <agenteId>1</agenteId>
                </AltaClienteInfoRequest>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

El objeto de respuesta es parecido, hagan de cuenta que es el mismo vale.

La cuestión es que no logro hacerlo con Jax-Ws, ya que el wsimport te crea la clase service, port y en caso de que los parametros de entrada y/o salida sean objetos también los crea para poder manipular la respuesta, pero en este caso como les comento solo recibe un Objeto(xsd:anyType) por lo tanto no me crea otras clases de apoyo.

Bueno al no concretar mi comunicación con Jax-Ws recurri a otra implementación la cual basicamente ocupa la libreria javax.xml.soap:

            MessageFactory factory = MessageFactory.newInstance();
            SOAPMessage message = factory.createMessage();
           
            SOAPPart soapPart = message.getSOAPPart();
           
            SOAPEnvelope envelope = soapPart.getEnvelope();
           
            SOAPHeader header = envelope.getHeader();
           
            SOAPBody body = envelope.getBody();
           
            bodyNameRequest = new QName("http://xxx.com/Clientes/ws/schemas", "AltaClienteInfoRequest");
           
            SOAPBodyElement bodyElement = body.addBodyElement(bodyNameRequest);
           
            QName uidQ = new QName("uid");
            SOAPElement uid = bodyElement.addChildElement(uidQ);
            uid.addTextNode("UID123456789012");
            .
            .
            .

            //Conexion
            SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection connection = soapConnectionFactory.createConnection();
           
            URL endpoint = new URL("http://xxx/services/altaCliente?wsdl");
           
            response = connection.call(message, endpoint);
            connection.close();

Pero el response no me devuelve nada, y al parecer ni hago contacto con wsdl...
Algún consejo de como implementar mi cliente ws???

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

axis2

Yo he tenido broncas implementando clientes con el wsimport de Java 6. Es poco configurable. He tenido mejores resultados usando Axis2, pero versión 1.5 porque la 1.5.2 me dio muchas broncas por unas cosas que cambiaron internamente y que dieron mucha lata a la hora de usar el cliente, creo que se compartían objetos entre instancias del stub y eso causaba problemas de concurrencia (aunque cada hilo usara su propio stub).

Si eso no te funciona, puedes intentar con Apache CXF, también es bueno.

Pero está raro que te genere un Object , será que está mal el WSDL con el que quieres generar el cliente?

Pero el response no me

Pero el response no me devuelve nada, y al parecer ni hago contacto con wsdl...

Si, primerititito hazle ping a esa máquina y luego intenta hacer un telnet al puerto 80, es probable que ni siquiera lo veas.

Luego intenta con algún otro cliente como el SOAUI.

Imagen de ezamudio

curl

También intenta obtener el WSDL con un curl o algo así... a mí me ha pasado que luego no funciona bien el cliente de web service porque al jalar el WSDL, resulta que los URL que vienen dentro del WSDL dicen localhost y pues obviamente al seguirlos el cliente no encuentra nada...

Imagen de rojovizcaino

endpoint

Soy un cuasianalfabeto en cuanto a webservices se refiere pero me parece que el endpoint debe terminar antes del ?wsdl.

URL endpoint = new URL("http://xxx/services/altaCliente");

Mhh no necesariamente...

Mhh no necesariamente...

Generalmente alguien te dira: "Este es el WSDL" y te darán una URL ( también puede ser un archivo pero eso estaría chafísima, pero bueno tiene sus usos )

Luego si pones ese URL en tu browser te sale un XML que es .. pues bueno, la "descripción del servicio web" ( por eso se llama WSDL -> WebService Description Language )

Eso es lo que toma un generador de stub o de cliente para generar el código. Si no tienes WSDL, pues ya valió, si lo tiene pero no puedes verlo, ya valió, si lo tienes lo puedes ver pero precisamente el endpoint no lo puedes ver también ya fué.

Intenta de nuevo ver primero el servicio:

Toma el SOAPUI

http://www.soapui.org/

Crea un nuevo proyecto ( en el proyecto solo le tienes que poner la ruta del WSDL ) y prueba!

Nos dices que te salió en tu soapUI

Imagen de rojovizcaino

mas específico, creo que el código tiene un error

            SOAPConnection connection = soapConnectionFactory.createConnection();
           
            URL endpoint = new URL("http://xxx/services/altaCliente?wsdl");
           
            response = connection.call(message, endpoint);

Creo el mensaje, el sobre, el tipo calificado para hacer el request y hasta ahi todo se ve bien (quizá la creación del elemento uid debiera utilizar el mismo namespace que uso en el QName anterior), nada más digo que a la hora de hacer el llamado el url a utilizar no debe ser el del wsdl sino en si el del servicio donde quiera que esté. Ahora, parace ser usual que el servicio y el wsdl comparten el mismo url excepto por el parámetro ?wsdl.

Imagen de ghosttigger1203

YAAAAAAA.... pude consumir los WS!

Antes que nada les doy las gracias por sus recomendaciones y les informo que YA pude consumir el WS!.
Hasta ahora no he tenido problemas con Jax-Ws revisandolo a detalle es hoy en día muy completo a mi parecer, tal vez cuando lo implementaste @ezamudio estaba en pañales... jejejeje bueno en fin.
La solución que le di es tan simple que hasta ahora no logro entender muy bien porque sirve así, simplemente le agregé esta linea entre el endPoint y la llamada como tal al servicio:

           message.writeTo(System.out);

quedando de la siguiente manera:

           URL endpoint = new URL("http://xxx/services/altaCliente?wsdl");
           message.writeTo(System.out);
           response = connection.call(message, endpoint);

Lo raro que agregando esta linea hace la petición al WS enviando mi mensaje Soap y me regresa al response la respueta también envuelta en Soap, lo mas raro es que esta linea solo es para imprimir como tal el mensaje Soap que generé anteriormente, si le quito la linea nomas no hace nada.... lo que deduzco es que ántes no teminaba de construir el mensaje y ya lo mandaba, obvio estaba vacío por lo tanto ni hacia la petición, agregando esta linea se espera a que termine de crear el mensaje para imprimirlo inmediatamente lo envía pero ya esta construido dado que se imprime.

Muy buenas opciones ezamudio para consumir los WS pero no podía implementarlas ya que dentro de los estandares que se tiene para consumir WS es utilizando solo Jax-Ws, nimodo debemos acoplarnos jejeje

En fin, les comparto el link del tutorial de Jax-Ws para los que quieran echarle un vistazo, es muy interesante.

     http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/index.html

Gracias @OscarRyz por el tip de SOAPUI ya se me había olvidado...

De nuevo gracias a todos... nos escribimos pronto!

Pues quién sabe, pero una

Pues quién sabe, pero una cosa es segura, consumir WS creando el cliente a mano es horrible ( pero ya te darás cuenta tu mismo )

Espero que encuentres alguna alternativa antes de que te vuelvas loco.

:)

Por cierto SOAPUI utiliza Axis2 para generar el cliente, consideralo.

Imagen de ezamudio

pues sigue en pañales

Dado que lo usé en Java 6 que es cuando salió y que todavía seguimos usando Java 6 porque seguimos estando a meses de ver la 7, si el JAX-WS estaba en pañales cuando lo usé el año pasado, sigue en pañales hoy.

Intenta ponerle un timeout de lectura y un timeout de conexión a tu web service (que definas que por ejemplo a los 5 segundos se tiene que establecer la conexión o te arroje excepción, y que máximo espere 20 segundos para obtener respuesta o arroje excepción). Con Axis2 eso son un par de líneas de código en el stub, con JAX-WS simplemente no encontré dónde poner eso, no hay manera.

Intenta ponerle también que use o no use el transfer-encoding:chunked. Y cuando lo encuentres, si lo encuentras, por favor, publica tus respuestas aquí.

Imagen de JavaMan

JAXWS excelente FRAMEWORK.

Que tal muchachos este tema me gusta bastante y me atreveré a postear mi opinion. La verdad que en el mercado hay varios Frameworks JAVA para que uno puedad trabajar Servicios Web y aplicar el estandar SOAP tan común en estos días. Yo desde hace varios bastantes años soy Integrador de Apliaciones SOAP y he tenido el agrado de experimientar con los los Frameworks: AXIS, AXIS2, JAXRPCy JAXWS y la verdad de todos me quedo con el último ya que me tiene muchas mejoras y veo que es el mas robusto y configurable de todos, por ejemplo con AXIS1 he tenido bastantes problemas para la generacion de Servicios y Proxys que contendas coleccions como ArraysList, Vector y Objetos propios ya que las IDES propiamente los generan mal. Ante este problema trabajae un tiempo con AXIS2 me gusto mucho pero la verdad que me genera muchas clases y types embebidos pero me gusto es muy buen Framework pero realmente de todos me gusta mas el JAXWS ya que es liviano, no tiene problemas en la generacion de Coleccions, no me genera muchas clases, se integra de maravilla con Spring y no requiere de muchos Jars. Ah me olvidaba en mi caso para la generacion de los mappings de los WSDL ( en fisico o en URL) yo prefieron manejarlo desde MAVEN osea manejo un proyectivo de tipo MAVEN con mi POM listo y configurable con 3 tipos de PLAUGINS distintos para: AXIS, AXI2 y JAXWS y sin necesidad de una IDE me genero en 4 segundos las clases necesarias para mis PROXYS y WS. Voy a darme en estos dias un tiempo para postearlo y compartir mi proyectito Generador. Aqui un par de POST que hice hace algun tiempo:

http://frameworksjava2008.blogspot.com/search/label/JAXWS

http://frameworksjava2008.blogspot.com/search/label/JAX-WS

Saludos ..!

Imagen de JavaMan

TIMEOUT JAXWS

Sobre el manejo de TIMEOUT en JAXWS es maneja en pocas lineas que las puedes reutilizar si tu WS orquesta varios WS a modo un WorkFlow metiendo en un método de eesta manera:

package pe.com.eia.services.proxy;

import java.util.Map;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.ws.BindingProvider;
import com.sun.xml.internal.ws.client.BindingProviderProperties;
import pe.com.claro.eia.services.exceptions.GenericException;
import pe.com.claro.eia.services.exceptions.TimeOutException;
import pe.com.claro.eia.services.exceptions.WSException;
import pe.com.claro.eia.services.paqueteclaro.bean.Generico;
import pe.com.claro.eia.services.paqueteclaro.bean.Usuario;
import pe.com.claro.eia.services.paqueteclaro.bean.gestiondatosusuariows.ConsultarUsuario.Arg0;
import pe.com.claro.eia.services.paqueteclaro.bean.gestiondatosusuariows.*;

/**
* @author Cesar Ricardo.
* @clase: TestGestionDatosUsuarioProxy.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class TestGestionDatosUsuarioProxy{

/**
* @param argumentos
*/
public static void main( String[] argumentos ){

try{
TestGestionDatosUsuarioProxy testDatosUsuario = new TestGestionDatosUsuarioProxy();

GestionDatosUsuarioWSSoapImplService objGestionDatosUsuario = new GestionDatosUsuarioWSSoapImplService();
GestionDatosUsuarioWSSoapImpl objGestionDatosUsuarioSoap = objGestionDatosUsuario.getGestionDatosUsuarioWSSoapImplPort();
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* consultarUsuarioProxy
* @param servicioWS
* @throws TimeOutException
* @throws WSException
* @throws GenericException
*/
public void consultarUsuarioProxy( GestionDatosUsuarioWSSoapImpl servicioWS ) throws TimeOutException, WSException, GenericException{
System.out.println( "********* DENTRO DE: [consultarUsuarioProxy] *********" );

ConsultarUsuarioInput objConsultarUsuarioInput = null;
ConsultarUsuarioOutput objConsultarUsuarioOutput = null;
Generico objGenerico = null;
Arg0 objArgumento = null;
Usuario objUsuario = null;
StringBuffer objCadena = null;
String saltoLine = null;

try{
objConsultarUsuarioInput = new ConsultarUsuarioInput();
objConsultarUsuarioOutput = new ConsultarUsuarioOutput();
saltoLine = new String( "\n" );

//DATOS [REQUEST]:
objUsuario = new Usuario();
objUsuario.setCodigo( 1 );

objCadena = new StringBuffer();

System.out.println( "[DATOS REQUEST]: " );
objCadena.append( "CODIGO: [" + objUsuario.getCodigo() + "]" );
System.out.println( objCadena );

//SETEANDO:
objConsultarUsuarioInput.setConsultarUsuarioInput( objUsuario );

int requestTimeout = (4 * 1000); //4 SEGUNDOS
int connectTimeout = 500;

String URL_new = "http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl"; //SERVER-JAVA

//TIMEOUT:
this.setTimeOutProxyWS( servicioWS, requestTimeout, connectTimeout, URL_new );

objArgumento = new Arg0();
objArgumento.setConsultarUsuarioInput( objConsultarUsuarioInput );

System.out.println( "" );

//DATOS [RESPONSE]:
objConsultarUsuarioOutput = servicioWS.consultarUsuario( objArgumento );

objUsuario = objConsultarUsuarioOutput.getConsultarUsuarioOutput();
objGenerico = objConsultarUsuarioOutput.getMensajeGenericoOutput();

String codigoGene = objGenerico.getCodigo();
String mensajeGene = objGenerico.getMensaje();
Integer codigo = objUsuario.getCodigo();
String nombres = objUsuario.getNombres();
String apellidos = objUsuario.getApellidos();
String nombreApellido = objUsuario.getNombreApellido();
String dni = objUsuario.getDni();
String telefono = objUsuario.getTelefono();
String email = objUsuario.getEmail();
XMLGregorianCalendar cumpleanos = objUsuario.getCumpleanos();
XMLGregorianCalendar fecRegDateTime = objUsuario.getFecRegDateTime();
String fecRegString = objUsuario.getFecRegString();

System.out.println( "[DATOS RESPONSE]: " );

objCadena = new StringBuffer();
objCadena.append( "- CODIGO GENE: [" + codigoGene + "]" + saltoLine );
objCadena.append( "- MENSAJE GENE: [" + mensajeGene + "]" + saltoLine );
objCadena.append( "- CODIGO: [" + codigo + "]" + saltoLine );
objCadena.append( "- NOMBRES: [" + nombres + "]" + saltoLine );
objCadena.append( "- APELLIDOS: [" + apellidos + "]" + saltoLine );
objCadena.append( "- NOMBRES-APELLIDOS: [" + nombreApellido + "]" + saltoLine );
objCadena.append( "- DNI: [" + dni + "]" + saltoLine );
objCadena.append( "- TELEFONO: [" + telefono + "]" + saltoLine );
objCadena.append( "- EMAIL: [" + email + "]" + saltoLine );
objCadena.append( "- CUMPLEANIOS: [" + cumpleanos + "]" + saltoLine );
objCadena.append( "- FECHA DATETIME: [" + fecRegDateTime + "]" + saltoLine );
objCadena.append( "- FECHA STRING: [" + fecRegString + "]" + saltoLine );

System.out.println( objCadena.toString() );
}
catch( Exception e ){

if( (e instanceof java.net.SocketTimeoutException) ){
throw new TimeOutException( "ERROR: [SocketTimeoutException] " + e.getMessage(), e );
}
else if( (e instanceof javax.xml.ws.WebServiceException) ){
throw new WSException( "ERROR: [WebServiceException] " + e.getMessage(), e );
}
else{
throw new GenericException( "ERROR: " + e.getMessage(), e );
}
}
}

/**
* setTimeOutProxyWS
* @param servicio
* @param requestTimeout
* @param connectTimeout
* @param URL_new
*/
public void setTimeOutProxyWS( GestionDatosUsuarioWSSoapImpl servicio, int requestTimeout, int connectTimeout, String URL_new ){

Map contextoRequest = ((BindingProvider)servicio).getRequestContext();
contextoRequest.put( BindingProviderProperties.REQUEST_TIMEOUT, requestTimeout );
contextoRequest.put( BindingProviderProperties.CONNECT_TIMEOUT, connectTimeout );

contextoRequest.put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, URL_new );
//contextoRequest.put (BindingProvider.USERNAME_PROPERTY, "usuarioWS" );
//contextoRequest.put (BindingProvider.PASSWORD_PROPERTY, "passwordWS" );
}

Saludos

Imagen de JavaMan

Olvidate de las IDES y sus Wizards generadores de WS.

Aqui el post que acabo de publicar, de lo mencionado anteriormente:

http://frameworksjava2008.blogspot.com/2012/05/wsdl-maven-generator.html

Saludos.

Imagen de JavaMan

ENDPOINT

Otra opcion es de esta manera:

/**
* setTimeOutProxyWS
* @param objBinding
* @param requestTimeout
* @param connectTimeout
*/
public void setTimeOutProxyWS( Object objBinding, int requestTimeout, int connectTimeout ){
((BindingProvider)objBinding).getRequestContext().put("com.sun.xml.ws.connect.timeout", connectTimeout);
((BindingProvider)objBinding).getRequestContext().put("com.sun.xml.ws.request.timeout", requestTimeout);
}

En algunos casos funciona con la anteior forma posteada y en otros con esta forma.

Saludos

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">