Mostrando entradas con la etiqueta AXIS2. Mostrar todas las entradas
Mostrando entradas con la etiqueta AXIS2. Mostrar todas las entradas

jueves, 17 de mayo de 2012

GENERADOR DE OBJETOS JAVA DESDE WSDL [MAVEN]


Hola chicos en esta oportunidad postearé, sobre un utilitario que manejo para el manejo de WebService. Todos sabrán que ahora el manejo de los Servicios Web esta muy de moda, sobre todo como una fuerte modalidad de INTEGRACION de sistemas legacy con otros tipos de sistemas, en IDEs de INTEGRACION como IBM Websphere Message Broker o el OSB de ORACLE. La cuestión es que en el mercado existen muchos Frameworks para la generación de WebService y Proxys (Clientes WS) tales como: AXIS, AXIS2, JAXRPC, JAXWS, uno mas antiguos que otros y otros mejores que otros. Por motivos de trabajo he tenido la necesidad que trabajar con todos y los conozco bien pero particularmente prefiero por motivos de mejor generación de objetos, mantenibilidad, etc JAXWS.

Una cosa que no me gusta es que por ejemplo las IDES como ECLIPSE, JDEVELOPER, etc no tienen el soporte a todas estos Frameworks y constantemente uno tiene que bajar un plugin o sino manejar varias herramientas por ejemplo ECLIPSE soporta WS embebido con AXIS solamente y si quiero trabajar con JAXWS me tengo que apoyar en por ejemplo el WID de IBM que lo tiene embebido y si quiero AXIS2 bajarme un plugin adicional. Algo similar pasa con JDeveloper. Por otro lado, el manejo de Wizards como que nunca me gusto mucho así que para mi la modalidad compartida a continuación es la mas optima.

Lo que manejo es un proyecto de tipo MAVEN, que solo lo utilizo como Generador de Objetos y clases JAVA en base al WSDL (en FISICO o URL) respectivamente. Esto lo hago mediante Plugins de MAVEN para cada tipo diferente de FRAMEWORK.

ESCENARIO #1:  "Tengo un WSDL y requiero hacer un WS o un PROXY". Que necesito GENERAR el WS o el PROXY (Independientemente de lo que necesite) en base al WSDL (esto es lo mejor osea tener ya creado el WSDL).

SOLUCION #1: Apoyarnos en una o varias IDEs dependiendo de que Framework querer usar y realizar dicha generación.
SOLUCION #2: Bajarnos los comprimidos de cada Framework, mapearlos en variables de entorno y ejecutar los comandos respectivos por tipo de Framework desde consola.
SOLUCION #3: Trabajar con la solución  planteada  WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip. Ya que solo requiere 2 cosas: Que tengas tu MAVEN configurado y cambiar el plugin del POM.xml en base al framework deseado, de donde de: resources/IMPORTANTE.txt y listo se genera el paquete de clases y objetos requeridos para que los cortes y lo lleves a tu proyecto JAVA donde trabajaras. Ya no necesitaras varias IDES ni nada en un PROYECTO MAVEN lo tienes todo para generar con: AXIS, AXIS2 y JAXWS.

Aqui les comparto los PLUGINs manejados (Por Motivos del BLOG, he cambiado los simbolos de MAYOR / MEJOR por corchetes):

  
     //------------------------------------------------------------------------//
     //----------------------- PLUGIN: JAXWS -----------------------//
     //------------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (JAXWS), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]:[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
           [execution]
              [goals]
                 [goal]wsimport[/goal]
              [/goals]
           [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageName]pe.com.javaman.dummy.jaxws[/packageName]
           [wsdlDirectory]src/main/webapp/wsdl[/wsdlDirectory]
           [sourceDestDir]src/main/java[/sourceDestDir]
           [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
           [keep]false[/keep]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
   
     [!-- GENERACION DE CLASES .JAVA (MAPPING JAXWS), EN BASE A LA [URL]  --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]jaxws-maven-plugin[/artifactId]
        [executions]
            [execution]
                [goals]
                   [goal]wsimport[/goal]
                [/goals]
                [configuration]
                    [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
                    [packageName]pe.com.javaman.dummy.jaxws[/packageName]
                    [wsdlUrls]
                      [wsdlUrl]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlUrl]
                    [/wsdlUrls]
                    [sourceDestDir]src/main/java[/sourceDestDir]
                    [!-- keep=true: MAVEN mantiene FUENTES. keep=false: MAVEN regenera FUENTES. --]
                    [keep]false[/keep]
                    [verbose]true[/verbose]
                [/configuration]
            [/execution]
        [/executions]
     [/plugin]

     //----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS1 -----------------------//
     //----------------------------------------------------------------------//

     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]
           [sourceDirectory]src/main/webapp/wsdl/[/sourceDirectory]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]
   
     [!-- GENERACION DE CLASES .JAVA (AXIS1), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.codehaus.mojo[/groupId]
        [artifactId]axistools-maven-plugin[/artifactId]
        [version]1.4[/version]
        [executions]
          [execution]
            [goals]
              [goal]wsdl2java[/goal]
            [/goals]
          [/execution]
        [/executions]
        [configuration]
           [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
           [packageSpace]pe.com.javaman.dummy.axis1[/packageSpace]       
           [urls]
             [url]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/url]
           [/urls]
           [outputDirectory]src/main/java[/outputDirectory]
           [helperGen]true[/helperGen]
           [verbose]true[/verbose]
        [/configuration]
     [/plugin]

     //-----------------------------------------------------------------------//
     //----------------------- PLUGIN: AXIS2 -----------------------//
     //----------------------------------------------------------------------//
   
     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.WSDL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]src/main/webapp/wsdl/GestionDatosUsuarioWSService.wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]

     [!-- GENERACION DE CLASES .JAVA (AXIS2), EN BASE AL [.URL] --]
     [plugin]
        [groupId]org.apache.axis2[/groupId]
        [artifactId]axis2-wsdl2code-maven-plugin[/artifactId]
        [version]1.5.4[/version]
        [executions]
            [execution]
                [goals]
                    [goal]wsdl2code[/goal]
                [/goals]
            [/execution]
        [/executions]
        [configuration]
            [!-- ASIGNACION DE [PAQUETE] DE CLASES GENERADAS --]
            [packageName]pe.com.javaman.generate.axis2[/packageName]
            [wsdlFile]http://localhost:8090/GestionDatosUsuarioWS/GestionDatosUsuarioWSService?wsdl[/wsdlFile]
            [outputDirectory]src/main/[/outputDirectory]
            [targetSourceFolderLocation]java[/targetSourceFolderLocation]
            [databindingName]xmlbeans[/databindingName] 
            [unpackClasses]true[/unpackClasses]
            [verbose]true[/verbose]     
            [options]
               [uwc]true[/uwc]
            [/options]        
        [/configuration]          
     [/plugin]


Para poder descargar el generador de WSDL pulsar: WSDL_MavenGenerator_JaxWs_Axis1_Axis2.zip


Saludos.



viernes, 6 de noviembre de 2009

MANEJO DE 'WEB SERVICE' CON 'AXIS2'.

Hace un tiempo posteè sobre el manejo de Web Service con AXIS1, esta vez mostraré el manejo de Web Service (Su consumo) pero con AXIS2. Este Framework AXIS2 a diferencia de su versión anterior AXIS1 permite un mejor manejo de los Web Service Orientados a Objetos, ya que en la versión anterior de AXIS los Objetos del Service enviados como parámetros por el Web Service, se podían regenerar desde un cliente WS pero para poder parsearlos se necesita de forma obligada el número de serialVersionUID (Para poder comprobar que es el mismo objeto) , aquí AXIS1 era débil. AXIS2 supero eso ya que no tiene este traspié. AXIS2 solamente posee un problema al momento de la generación del cliente WS que mas adelante mostraremos y solucionaremos.

Al igual que el ejemplo posteado con AXIS1 mostraré la generación del Cliente WS y consumo de dichos procesos:

/********** PROCESOS 'WS' **********/
//Probando 'SUMA'.
clienteWS.getResultadoSuma( numero_01, numero_02, accesoWS );

//Probando 'RESTA'.
//clienteWS.getResultadoResta( numero_01, numero_02, accesoWS );

//Probando 'MULTIPLICACION'.
//clienteWS.getResultadoMultiplicacion( numero_01, numero_02, accesoWS );

//Probando 'DIVISION'.
//clienteWS.getResultadoDivision( numero_01, numero_02, accesoWS );

//Probando 'obtenerUsuario'.
//clienteWS.getObjetoUsuario( accesoWS );

//Probando 'obtenerListaUsuarios'.
//clienteWS.getListaUsuarios( accesoWS );;
/***********************************/

Los pasos son los siguientes:

1.- Tenemos el WSDL ya generado del servidor “UsuarioServiceImpl.wsdl” , este WSDL esta en la ruta: WebContent/wsdl/UsuarioServiceImpl.wsdl. En base a esta ruta generaremos por medio de consola el Cliente AXIS2, pero tendremos que configurar las variables de entorno antes.

2.- Bajarte la ultima versión de AXIS2: http://ws.apache.org/axis2/1_5_1/installationguide.html

3.- Ubicarla en una ruta en tu PC: “D:\JAVA\Axis\axis2-1.5.1”

4.- Registrar las variables de entorno (Tanto en Usuario como en Sistema):



5.- Generar el cliente AXIS2 desde consola aplicando el siguiente còdigo desde la ruta raiz del proyecto trabajado:

%AXIS2_HOME%/bin/WSDL2Java -p org.java.service -uri WebContent/wsdl/UsuarioServiceImpl.wsdl -s



6.- En este momento AXIS2 genera un error:

Es posible que cuando se desee generar un cliente JAVA con AXIS2 en base a un WSDL, uno encuentre con un error así:

Unexpected subelement 'XXXX'

Esto se debe a que AXIS2 genera el Cliente WS de una forma no totalmente correcta. Ya que confunde los NameSpaceURI. Supongamos como en este caso que el Servidor WS posee dos paquetes:

- PAQUETE DEL OBJETO: org.java.bean
- PAQUETE DEL WS: org.java.servidor.ws

Al momento de la generación del Cliente WS con AXIS2, los NameSpaceURI se invierten y quedan de la siguiente manera:

- NAMESPACE APUNTANDO AL OBJETO: “http://bean.java.org"
- NAMESPACE APUNTANDO AL WS: "http://ws.servidor.java.org"

Aquí esta el problema y la solución seria buscar la clase 'Stub' generada, en este caso 'ConsultaWSServiceStub' y en ella buscar por cada Objeto que se trabaje su:

static MY_OBJETO parse:

/**
* Factory class that keeps the parse method
*/
public static class Factory{

/**
* static method to create the object Precondition: If this object is an element, the
* current or next start element starts this object and any intervening reader events
* are ignorable If this object is not an element, it is a complex type and the reader
* is at the event just after the outer start element Postcondition: If this object is
* an element, the reader is positioned at its end element If this object is a complex
* type, the reader is positioned at the end element of its outer element
*/
public static Usuario parse( javax.xml.stream.XMLStreamReader reader ) throws java.lang.Exception{

Y cambiar el NameSpace para cada campo de > cada Objeto trabajado, de la siguiente forma:

AQUI SE DA EL 'ERROR':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://bean.java.org", "nombre" ).equals( reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre( org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

AQUI SE DA EL 'SOLUCION':

while( !reader.isStartElement() && !reader.isEndElement() )
reader.next();
if( reader.isStartElement() &&
new javax.xml.namespace.QName( "http://ws.servidor.java.org", "nombre" ).equals(
reader.getName() ) ){
nillableValue = reader.getAttributeValue( "http://www.w3.org/2001/XMLSchema-instance", "nil" );
if( !"true".equals( nillableValue ) && !"1".equals( nillableValue ) ){
java.lang.String content = reader.getElementText();
object.setNombre(
org.apache.axis2.databinding.utils.ConverterUtil.convertToString( content ) );
}
else{
reader.getElementText(); // throw away text nodes if any.
}
reader.next();
} // End of if for expected property start element
else{
// A start element we are not expecting indicates an invalid parameter was
// passed throw new org.apache.axis2.databinding.ADBException( "Unexpected subelement " + reader.getLocalName() );
}

7.- Creamos la clase: org/java/client/ClienteWS_Generado.java y vamos descomentando y ejecutando los procesos anteriormente nombrados uno por uno para probar su manejo. Recordar que primero se tiene que desplegar el demo del 'Proyecto Servidor' que es parte del demo posteado llamado: Ejemplo Web Service con JAX-WS , para poder probar sin problemas el Cliente WS con AXIS2.

Para mayor detalle descargar el ejemplo completo: AQUÌ.