AXIS2 version 1.8 web service en tomcat 9



Crear un servicio
1. Instalar ella utilidad ant para generar las clases de integración axis2
# sudo yum update
# suso yum ant

2. Descargar axis2 version 1.8 para generar el cliente
https://axis.apache.org/axis2/java/core/download.html

3. Descargar axis2 version 1.8 war para crear/server
https://dlcdn.apache.org/axis/axis2/java/core/1.8.0/axis2-1.8.0-war.zip

4. Descomprimir los archivo: axis2-1.8.0-bin.zip
con unzip.
# unzip axis2-1.8.0-bin.zip
# unzip axis2-1.8.0-war.zip

5.
Ubicar la carpeta generada  axis2-1.8.0-bin  en /usr/local (por comodidad)
Ubicar la carpeta generada  axis2-1.8.0-war en /usr/local/tomcat/webapps

6.
Localizar la version de java que se esta ejecutando
# sudo java -version

Muestra:
>openjdk version "1.8.0_302" ( o de forma general java --version)
>OpenJDK Runtime Environment (build 1.8.0_302-b08)
>OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)

Nos informa que tiene instalada el java de openJDK

Localizar la carpeta donde esta ubicada.
# sudo  locate openjdk

/etc/alternatives/java_sdk_1.8.0_openjdk
/etc/alternatives/java_sdk_1.8.0_openjdk_exports
/etc/alternatives/java_sdk_openjdk
/etc/alternatives/java_sdk_openjdk_exports
/etc/alternatives/jre_1.8.0_openjdk
/etc/alternatives/jre_1.8.0_openjdk_exports
/etc/alternatives/jre_openjdk
/etc/alternatives/jre_openjdk_exports
/usr/lib/jvm/java-1.8.0-openjdk
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.amzn2.0.1.x86_64
/usr/lib/jvm/java-openjdk

Colocarla la variable de entorno JAVA_HOME y los binarios axis2 en /etc/enviroment


#sudo emacs /etc/enviroment
JAVA_HOME="/usr/lib/jvm/jre-1.8.0-openjdk"
AXIS2_HOME="/usr/local/axis2"

verificar que JAVA_HOME quedo correcto
# echo $JAVA_HOME
/usr/lib/jvm/jre-1.8.0-openjdk

7. Para que funcione con http y Https.
Recordar instalar certificado SSL
Ver al final del documento como configurar el transport receiver
para que funcione con http y https.
 
8. Instalar las librerías externas necesarios :

En mi caso como uso librerías externas por ejemplo de mongodb en /usr/local/axis2/
coloco allí:

/usr/local/axis2/lib/mongodb-driver-core-4.3.0.jar
/usr/local/axis2/lib/mongodb-driver-sync-4.3.0.jar
/usr/local/axis2/lib/bson-4.3.0.jar

Las cuales también instalo en en la carpeta /usr/local/tomcat/lib

/usr/local/tomcat/lib/mongodb-driver-core-4.3.0.jar
/usr/local/tomcat/lib/mongodb-driver-sync-4.3.0.jar
usr/local/tomcat/lib/bson-4.3.0.jar

9. Ingresar a la carpeta /usr/local/axis2 , donde se encuentra la estructura para generar axis2 server.


10. copiar la carpeta samples en la nueva carpeta a integrar por ejemplo usuarios
# sudo mkdir usuarios

11. La carpeta samples tiene muchos ejemplos de integración en este caso nos interesa dejar una sola carpeta llamada quickstart , dejamos
solo esta carpeta y el archivo pom.xml
copiar estos archivos en la nueva carpetas creada usuarios

# sudo cd usuarios
# sudo cp -rf ../samples/quickstart .
# sudo cp ../pom.xml

12. Renombramos la carpeta quickstar por el nuevo servicio que es este caso llamamos usuariosInfo
# sudo mv quickstar usuariosInfo

El archivo pom.xml no requiere ninguna modificación.

13. Ingresar a la carpeta usuariosInfo
# sudo cd usuariosInfo
8. listamos los archivos que allí se encuentran para verificar que se
encuentren los correctos.


# sudo ls -lD

ebe mostrar algo similar a esto.

drwxr-xr-x 3 root root   48 abr 20 01:05 build
-rw-r--r-- 1 root root 2977 abr 19 23:01 build.xml
-rw-r--r-- 1 root root 1627 abr 19 22:01 README.txt
drwxr-xr-x 3 root root   22 abr 19 22:01 resources
drwxr-xr-x 3 root root   22 abr 19 22:02 src

El carpeta build debe estar vacío, allí se crean los archivos class y el archivo .arr  que se genera el construirlo mediante el comando ant.
El archivo build permite construir las clases necesarias para la integración debe se ajustada pora que use las rutas correctas al momento de compilar mediante ant
README,txt informa sobre los procedimientos a efectuar al momento de
ejecutar el comando ant para que genere os archivos de clases en build
La carpeta resources manteniente el archivo de declaración de servicios  necesarias para compilar las clases de integraciones
La carpeta src tiene los archivos tipo java necesarios para compilar la integración

14. Borrar cualquier archivo permanente de la carpeta build
# sudo cd build
# sudo rm -rf *
# sudo ..

15. Modificar según  conveniencia el archivo build.xml para que refleje la posición de los archivos de interés en este caso usuario(s) que la integración de interés.
Debe quedar de forma similar a la siguiente, observar el uso de proyect name = “usuariosInfo” , para nombrar la integración.
Recordar colocar la variable de entorno AXIS_HOME que se indico
en un paso anterior.

# sudo emacs build.xml

<project name="usuarioinfo" basedir="." default="generate.service">

    <property environment="env"/>
    <property name="AXIS2_HOME" value="../.."/>

    <property name="build.dir" value="build"/>

    <path id="axis2.classpath">
        <fileset dir="${AXIS2_HOME}/lib">
            <include name="*.jar"/>
        </fileset>
    </path>

    <target name="compile.service">
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.dir}/classes"/>

        <!--First let's compile the classes-->
        <javac debug="on"
               fork="true"
               includeantruntime="false"
               destdir="${build.dir}/classes"
               srcdir="${basedir}/src"
               classpathref="axis2.classpath">
        </javac>
    </target>


# sudo ../

16. Ingresar a la carpetas resources/META-INF y configurar el archivo de servicios.xml

Notar que aunque se hace uso de la etiqueta http en realidad se refiere a carpetas al interior de integración que estamos desarrollando no al sitio web donde el servicio está, esto usualmente
es confuso.

# sudo resources/META-INF
# sudo emacs services.xml


<service name="UsuariosService" scope="application" targetNamespace="http://usuarioinfo.usuarios/">
    <description>                                                                                                                           
        Usuarios Service                                                                                                                    
    </description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/ns/wsdl/in-only"
                         class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/ns/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <schema schemaNamespace="http://usuarioinfo.usuarios/xsd"/>
    <parameter name="ServiceClass">usuarios.usuarioinfo.service.pojo.UsuariosService</parameter>
</service>

# sudo cd ../..

17. ingresar a la carpeta src
# sudo cd src

Mover la carpeta samples a usuarios , para hacerla coincidir con la estructura que se está creando.
Los nombres pueden ser cualquiera , pero por facilidad mantengo esa
nomenclatura para facilidad de ubicación de información.

# sudo mv samples usuarios

18. Ingresar a la carpeta recién usada usuarios
# sudo cd usuarios

19. Renombrar la carpeta quickstar por usuariosInfo de nuevo por comodidad y mantener cierta estructura.
# sudo mv quickstart usuariosInfo

20. Encontrar la carpeta de services, la dejo como está e ingreso
# sudo cd services

21. Encontrar la carpeta pojo , la dejo como está en ingreso
# sudo cd pojo

22. Encontrar los archivos class que van a permitir ofrecer el servicio de integración. Elimine cualquier archivo que este allí antes de proceder a crear sus archivos de servicios.

En mi caso uso el modelo DAO/DTO y se verá así

-rwxrwxrwx 1 root root  1118 abr 19 22:53 ConexionDTO.java
-rwxrwxrwx 1 root root  2357 abr 19 22:54 ConexionMongo.java
-rwxrwxrwx 1 root root 31626 abr 19 22:54 ConfigurarDAO.java
-rwxrwxrwx 1 root root 15490 abr 19 22:54 ConfigurarDTO.java
-rwxrwxrwx 1 root root  2247 abr 19 22:55 ConfigurarInterface.java
-rwxr-xr-x 1 root root  3356 abr 20 00:53 SendMail.java
-rwxr-xr-x 1 root root  6204 abr 20 00:53 SMS.java
-rwxrwxrwx 1 root root 57790 abr 19 22:55 Sos.java
-rwxrwxrwx 1 root root 37691 abr 20 00:49 UsuariosDAO.java
-rwxrwxrwx 1 root root  6420 abr 20 00:52 UsuariosDTO.java
-rwxrwxrwx 1 root root  2318 abr 20 00:53 UsuariosInterface.java
-rwxrwxrwx 1 root root 13513 abr 20 00:46 UsuariosService.java
-rwxr-xr-x 1 root root 16240 abr 20 00:56 UtilidadesDAO.java
-rwxr-xr-x 1 root root 14444 abr 20 00:51 UtilidadesDTO.java
-rwxr-xr-x 1 root root   800 abr 20 00:53 UtilidadesInterface.java

Como normalemente ocurre en java es muy importante referirse al packet correcto para que la generar los ejecutables el sistema pueda compilar correctamente en en mi caso que corresponde a la estructura que vengo creando.

package usuarios.usuarioinfo.service.pojo;

En mi caso como uso mongodb como base de datos incluyo los archivos que necesito de mongodb que están en la carpeta /usr/axis2/lib que copie  en un paso 8. anteriormente descrito.

Import java.io.* ;                                                   
import java.util.*;                                                       
import java.text.*;                                                       

import com.mongodb.client.*;
import com.mongodb.MongoClientSettings;
import com.mongodb.ConnectionString;
import com.mongodb.ServerAddress;
import com.mongodb.MongoCredential;



23. Una vez creados los servicios que voy a desplegar y que en mi caso defino en el archivo UsuariosService.java  donde voy a desplegar los servicios que necesito.

Nota: Dependerá del tipo de estructura que cada desarrollador empleó para presentar los servicios.

En mi caso se verá algo similar a lo siguiente:

--------------------------------------------------------------------

package usuarios.usuarioinfo.service.pojo;

import java.io.*                   ;
import java.util.*                 ;
import java.text.*                 ;
import java.math.*                 ;
import java.security.MessageDigest ;
import java.util.HashMap           ;

import com.mongodb.client.*        ;

public class UsuariosService {

    public boolean UsuariosExiste(String DB,
                                 UsuariosDTO usuarios
                                )
       {
   MongoClient mongoClient = MongoClients.create()                  ;

   try
       {

     UsuariosDAO  UsuariosDAO = new UsuariosDAO()                   ;
     MongoDatabase mgDB = ConexionMongo.Conectar( DB , mongoClient) ;

     booleanexiste = false                                          ;                           
    existe = UsuariosDAO.UsuariosExiste(mgDB,
                                          usuarios
                                    )                               ;
         mongoClient.close()                                        ;
        return existe                                               ;
            }
   catch (Exception e)
            {
       System.out.println("Error, usuarios Existe: " + e.toString());
        e.printStackTrace(System.out)                               ;
        mongoClient.close()                                        ;
      return false                                                 ;
            }
       }


     public UsuariosDTO UsuariosRegistros(String DB,
                                    UsuariosDTO usuarios
                                   )
       {
   MongoClient mongoClient = MongoClients.create()                 ;
   UsuariosDAO UsuariosDAO = new UsuariosDAO()                     ;
   UsuariosDTO usuariosInfo= new UsuariosDTO()                     ;

   try
        {

      MongoDatabase mgDB = ConexionMongo.Conectar( DB , mongoClient);
      usuariosInfo = UsuariosDAO.UsuariosRegistros(mgDB,
                                                  usuarios
                                              )                     ;
         mongoClient.close()                                        ;
        return usuariosInfo                                         ;
            }
   catch (Exception e)
            {
       System.out.println("Error, usuarios Conteo: " + e.toString());
       e.printStackTrace(System.out)                                ;
       mongoClient.close()                                          ;
       return (usuariosInfo)                                        ;
            }
       }

     public UsuariosDTO UsuariosConsultar(String DB,
                                  UsuariosDTO usuarios
                                 )
       {
   MongoClient mongoClient = MongoClients.create()                 ;
   UsuariosDAO UsuariosDAO = new UsuariosDAO()                     ;
   UsuariosDTO usuariosInfo= new UsuariosDTO()                     ;

   try
        {

      MongoDatabase mgDB = ConexionMongo.Conectar( DB , mongoClient);
      usuariosInfo = UsuariosDAO.UsuariosConsultar(mgDB,
                                              usuarios
                                        )                            ;

       mongoClient.close()                                          ;
       return (usuariosInfo)                                        ;
            }
  catch (Exception e)
            {
      System.out.println("Error, usuarios Info : " + e.toString())  ;
        e.printStackTrace(System.out)                               ;
        mongoClient.close()                                         ;
      return (usuariosInfo)                                         ;
            }
       }

}


Donde se ve que van a publicarar 3 servicios

  • UsuariosExiste()
  • UsuariosRegistros()
  • UsuariosConsultar()


Con la asignación de su respectiva referencia al packet y librerías usadas en el desarrollo.
Lo subrayado en amarillo , son los procesos definidos en el archivo de de tipo DAO y respectivos POJO (archivos DTO).

24. Una vez creada toda la estructura de servicios a desplegar regresamos a a la carpeta donde se encuentra el build y ejecutamos el comando ant

# sudo cd /usr/local/axis2/usuarios/usuarioInfo
efectuamos el comando ant
# sudo ant

Si generó el servico correctamente nos debe mostrar una informaación similar a lo siguiente:

Buildfile: /usr/local/axis2/usuarios/usuariosInfo/build.xml

compile.service:
    [javac] Compiling 15 source files to /usr/local/axis2/usuarios/usuariosInfo/build/classes

generate.service:
      [jar] Building jar: /usr/local/axis2/usuarios/usuariosInfo/build/UsuariosService.aar
     [copy] Copying 1 file to /usr/local/axis2/repository/services

BUILD SUCCESSFUL
Total time: 5 seconds


25. Ahora colocamos el archivo de servicios a desplegar que debe encontrarse en /usr/local/axis2/usuarios/usuariosInfo/resources con el nombre del servicio a desplegar con extensión .arr

 
# sudo cd /usr/local/axis2/usuarios/usuariosInfo/resources
# sudo ls -l

Muestra:
drwxr-xr-x 4 root root    38 abr 20 01:04 classes
-rw-r--r-- 1 root root 42909 abr 20 15:32 UsuariosService.aar

26.
El archivo UsuariosService.arr debe ser colocado en el servidor tomcat bajo
/usr/local/tomcat/webapps/axis2/WEB-INF/services/ para que el servidor tomcat puede desplegar el servicio.

# sudo cp UsuariosInfo.arr /usr/local/tomcat/webapps/axis2/WEB-INF/services/

27.
Si se tienen habilitados los puertos Http y Https es necesario configurar los puertos de axis2 para que reconozca los puertos correctos ya que axis2 no tiene forma de detectar los puertos correctos y siempre supone que se tiene solo http en el puerto 8080, si tiene el https no va a ser capaz de encontrarlos y el despliegue del servicio falla y no muestra los servicios desplegados. Aunque el servicio indique qu esta correctamente instalado.

Seguir el siguiente procedimiento recomendado por axis2 para resolver ese problema. ( a continuación)

HTTP servlet transport

Introduction
The servlet transport processes HTTP requests received through the servlet container in which Axis2 is deployed. It is different from the other transports because its lifecycle is not managed by Axis2, but by the servlet container. Two things are necessary to enable and configure the servlet transport:
org.apache.axis2.transport.http.AxisServlet must be registered and mapped as a servlet in web.xml. 


One or more org.apache.axis2.transport.http.AxisServletListener instances must be declared as transport receivers in axis2.xml.
It should be noted that the role of AxisServlet is not limited to that of an Axis2 transport, but that it provides two additional features:
It starts the Axis2 runtime and sets it up to load the axis2.xml configuration as well as the repository from the Web application.
It exposes the WSDL documents of deployed services. The WSDL of a service can be accessed by appending ?wsdl to the EPR of the service.
Adding AxisServlet to web.xml

AxisServlet is typically configured as follows in web.xml:
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>


Note that the prefix used in url-pattern must match the servicePath parameter in axis2.xml. The default value of this parameter is services, which is compatible with the above configuration. 


Configuring axis2.xml
For each protocol (HTTP and/or HTTPS), an AxisServletListener instance must be declared in axis2.xml. If only a single protocol is used, no further configuration is required. For example, if only HTTP is used, the following declaration must be present in axis2.xml: 


<transportReceiver name="http" class="org.apache.axis2.transport.http.AxisServletListener"/>


If both HTTP and HTTPS are used, then things become a bit more complicated. The reason is that in order to expose WSDLs with correct endpoint URIs, AxisServlet must know the ports used by HTTP and HTTPS. Unfortunately the servlet API doesn't allow a Web application to discover all configured protocols. It only provides information about the protocol, host name and port for the current request. If only a single AxisServletListener is configured, then this information is enough to let AxisServlet auto-detect the port number. If both HTTP and HTTPS are used (or if WSDLs are retrieved through transports other than AxisServlet), then AxisServlet has no way of knowing the port numbers until it has processed at least one request for each protocol. To make WSDL generation predictable in this scenario, it is necessary to explicitly configure the port numbers in axis2.xml, such as in the following example: 

<transportReceiver name="http" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">8080</parameter>
</transportReceiver>

<transportReceiver name="https" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">8443</parameter>
</transportReceiver>

Remplazar 8080 y 8443 por lor 80 y 443 si esta usando la conexión directa por http tipo apache.

Es buena practica reiniciar el servidor tomcat para que actualice los servicios.


28. Si todo quedo correcto dirigirse a su navegador y digite la url se su sitio con el path de axis2

https://misitio.com/axis2
Debe desplegar la pantalla de axis2 con 3 menú,
Services
Valide
administration





29. Dando click en servicios se despliega la pantalla con los servicios habilitados coo se ve continuación



Información general sobre axis2.

Usando Json con axis2
https://programmerclick.com/article/4456379842/

Soap.
http://desarrolloconsoa.blogspot.com/2014/02/conceptos-basicos-de-servicios-web-soap.html

Manual WDSL
https://axis.apache.org/axis2/java/core/docs/userguide-buildingservices.html#buildservices

Manual Axis2
https://docs.huihoo.com/apache/axis2-1.0-docs/xdocs/1_0/userguide1.html

Generar archivos del cliente stub
/usr/local/axis2/bin/wsdl2java.sh  -uri  http://www.urbicloud.com.co:8080/mistub?wsdl -o client

/usr/local/axis2/bin/wsdl2Java.sh -uri urbiStub.wsdl -p org.apache.axis2.axis2urbiStub -d adb -s
-uri  http://www.urbicloud.com,co:80/mistub?wsdl -o clien
t

Copiar en axis/lib
/usr/local/axis2/bin/wsdl2java.sh

Comentarios

Entradas populares