Consumir un servicio web Axis con Android

7
29189

Consumir servicio web rest en Axis2 con Android

0. Índice de contenidos.

1. Introducción

En este tutorial se pretende mostrar, paso a paso, cómo consumir un servicio web REST con Axis2 desde una aplicación Android. Está dirigido a personas que apenas tienen experiencia previa en montar un servicio web con Java.

Más específicamente, vamos a construir una aplicación Android que nos va a mostrar varias listas de compras, cada una con sus productos, y toda la información de esas listas se van a cargar a través de un servicio web.

2. Entorno

  • Hardware
    • Mackbook Pro
      • Intel Core i7 2Ghz
      • 8GB RAM
      • 500GB HD
      • Sistema Operativo: Mac OS X (10.6.6)
    • Nexus One
      • Android 2.3.3 (Gingerbread).
  • Software
    • Eclipse Galileo
    • PostgresSQL 9.0.3
    • Hibernate 3
    • Spring 2.5
    • Axis 1.4.1
    • Apache Tomcat 6.0

3. Instalación

El gestor de base de datos que vamos a utilizar PostgresSQL, en concreto la versión 9.0.3. Para obtener el gestor nos dirigiremos hacia http://www.postgresql.org/download/ y descargaremos la versión que corresponda con nuestro sistema operativo.

La herramienta de desarrollo que vamos a utilizar es Eclipse, la versión Galileo. Si el lector no dispone de esta herramienta, puede ir a http://wiki.eclipse.org/Older_Versions_Of_Eclipse

y elegir el paquete «Eclipse IDE for Java EE Developers, (188MB)»

El servidor de aplicaciones que vamos a utilizar es Apache Tomcat 6.0, si no lo tenemos, necesitaremos descargarlo. Para obtenerlo, nos dirigimos a http://tomcat.apache.org/download-60.cgi y nos bajamos los binarios de «Core», en mi caso elijo el «tar.gz»

y lo descomprimimos en una ubicación que utilizaremos más tarde.

Además nos van a hacer falta las librerías de Axis2. Para descargarlas, vamos a http://axis.apache.org/axis2/java/core/download.cgi y elegimos de la versión 1.4.1, la distribución WAR.

Una vez descargada la descomprimimos y configuramos Eclipse para que sepa donde se encuentra.
Para configurar Eclipse, abrimos Eclipse – > Preferences, y dentro de Preferences, nos dirigimos a WebServices -> Axis2 Preferences y le indiciamos donde se encuentra el WAR que acabamos de descargar.

También vamos a instalar «Hibernate-tools» para que nos ayude con la configuración de Hibernate a la hora de crear los archivos de mapeo de nuestros Bean. Para ello, en Eclipse, abrimos «Help» -> «Install New Software»,

y añadimos el repositorio de Jboss en donde se van a encontrar las «Hibernate-tools». Para añadir el repositorio, pulsamos el botón «Add» y rellenamos la ventana. En «Name» le ponemos un nombre al repositorio, y en «Location», especificamos la ruta en donde se encuentran los archivos. En mi caso he puesto como «Name» Jboss Tools y en «Location» «http://download.jboss.org/jbosstools/updates/stable/galileo/»

Pulsamos en ok, Entonces filtramos por «Hibernate tools», marcamos el check que corresponda con «Hibernate tools» y pulsamos en «Next».

Entonces se pondrá a calcular dependencias y tras un rato, aparecerá una pantalla como esta:

Pulsamos en «Next»

Aceptamos todas las licencias y le damos a «Finish» con lo que empezará a descargar las «Hibernate-tools»

Cuando termine de adquirir los archivos necesarios, nos mostrará un aviso indicándonos que el contenido que se ha descargado no está firmado. Le damos a «Ok» y empezará con la instalación del plugin.

Una vez instalado nos mostrará un aviso indicándonos que necesita reiniciar Eclipse para que los cambios se hagan efectivos. Pulsamos en «Yes» y reiniciará Eclipse.

También nos va a facilitar la tarea si instalamos el plugin SpringIde para Eclipse. Para instalarlo, lo haremos, igual que en el caso anterior, a través de Eclipse. Pinchamos en «Help» -> «Install New Software» y añadimos un nuevo repositorio. En este caso tendremos que rellenar el campo «Location» con «http://dist.Springframework.org/snapshot/IDE/nightly» en «Name» pondremos algo del estilo «SpringIDE»

Una vez que ha creado el indice de los paquetes seleccionamos «Core / Spring IDE»

y al igual que en el caso anterior, le damos a «Next» y aceptamos tanto la licencia como el aviso de instalación de software sin firmar.

NOTA: Se obviará la instalación y configuración del sdk de android y de los plugins de Android para Eclipse

4. Crear el servidor

Una vez que tenemos configurado todo lo necesario para realizar el proyecto, empezamos con lo divertido, a codificar :).

Desde eclipse, creamos un nuevo proyecto Web, por lo que clickeamos en File -> New Project -> Dynamic Web Project y nos aparecerá una pantalla como esta

En nuestro caso el proyecto se va a llamar ListaComprasSW.

En esta misma ventana, vamos a especificar (aunque se puede hacer posteriormente) el «Target Runtime» haciendo click en el botón «New»,

Escogemos, «Apache Tomcat v6.0» y pulsamos el botón «Next».

En la ventana que nos aparece, pulsamos en «Browse», y seleccionamos la ruta en la que hemos descomprimido anteriormente el «Apache Tomcat» que hemos descargado.

Pulsamos «Finish» y volvemos a la ventana que nos aparece cuando creamos un nuevo proyecto y pulsamos en el botón «Modify». Habilitamos «Axis2 Web Services Core» y «Axis2 Web Services Extensions» quedándonos como la pantalla que se muestra a continuación.

Con lo que finalmente, la ventana de configuración de un nuevo proyecto nos queda así:

Pulsamos «Finish» y nos creará el esqueleto de la aplicación.

Lo primero que vamos a hacer es el modelo de datos. En nuestro caso, el modelo es muy sencillo, consta de dos tablas y de una relación 1 a N.

Una tabla en donde guardaremos las listas de la compra de nombre listacompra, que tendrá un idListaCompra que será su clave primaría y dos campos más en donde guardaremos la fecha en la que se creó y el nombre de la lista de la compra.

La segunda tabla será en la que almacenaremos los productos que queremos guardar en la lista de la compra. Esta tabla contiene un idCompra que es su clave principal, un campo para guardar el nombre del producto, otro campo para guardar si el producto se ha cogido ya y una clave foránea que obtendrá de la tabla listacompra para crear la relación.

Este modelo queda reflejado en dos beans que agregaremos al proyecto, dentro del paquete com.pruebas.bean.

El código correspondiente a ListaCompra.java es

package com.pruebas.bean;  
  
import java.util.List;  
  
public class ListaCompra {  
    int idListaCompra;  
    String nombre;  
    String fecha;  
    List productos;  
      
    public ListaCompra()  
    {  
          
    }  
      
    public int getIdListaCompra()  
    {  
        return idListaCompra;  
    }  
      
    public void setIdListaCompra(int idListaCompra)  
    {  
        this.idListaCompra = idListaCompra;  
    }  
  
    public String getNombre()  
    {  
        return nombre;  
    }  
  
    public void setNombre(String nombre)  
    {  
        this.nombre = nombre;  
    }  
  
    public String getFecha()  
    {  
        return fecha;  
    }  
      
    public void setFecha(String fecha)  
    {  
        this.fecha = fecha;  
    }  
  
    public List getProductos()  
    {  
        return productos;   
    }  
  
    public void setProductos(List productos)  
    {  
        this.productos = productos;  
    }  
}

El código correspondiente a Producto.java es

package com.pruebas.bean;  
  
public class Producto {  
      
    int idProducto;  
    String nombre;  
    boolean enCesta;  
      
    public int getIdProducto()  
    {  
        return idProducto;  
    }  
      
    public void setIdProducto(int idProducto)  
    {  
        this.idProducto = idProducto;  
    }  
      
    public String getNombre()  
    {  
        return nombre;  
    }  
      
    public void setNombre(String nombre)  
    {  
        this.nombre = nombre;  
    }  
  
    public boolean getEnCesta()  
    {  
        return enCesta;  
    }  
      
    public void setEnCesta(boolean enCesta)  
    {  
        this.enCesta = enCesta;  
    }  
  
} 

Vemos como la clase ListaCompra va a tener una propiedad «List» en donde va a almacenar todos los productos que pertenecen a una lista.
Y si os fij´is, veréis que la clase Producto.java, no tiene ninguna propiedad para referirse al padre, aunque en el modelo de datos la tabla en la que mapearemos la clase Producto si debe tener una cláve foránea que obtiene de la tabla ListaCompra.

Para realizar el mapeo entre los objetos del proyecto y la base de datos en la que guardaremos la información tenemos que crear unos archivos para indicar de que forma queremos que se relaciones nuestra base de datos con nuestros objetos de la aplicación.

Para crear estos archivos lo que hacemos es clickear con el botón derecho en el proyecto y entonces en «New» -> «Other» como se muestra a continuación

y seleccionamos Hibernate XML Mapping file ( hbm.xml)

en la ventana que nos aparece, seleccionamos «Add package» e incluimos el paquete com.pruebas.bean que es donde se encuentran las dos clases que queremos mapear con Hibernate.

Pulsamos en «Finish» y nos creará los dos archivos de mapeado.

Vamos a modificar un poco estos archivos.

Archivo creado por el asistente.

  
  
  
  
      
          
              
              
          
          
              
          
          
              
          
          
              
                  
              
              
              
          
      
 

Archivo final

  
  
  
  
     
         
             
             
         
         
             
         
         
             
         
         
          
             
                 
             
             
             
                            
     
 

El primer cambio aparece al seleccionar un generador distinto al que nos pone el asistente. Al cambiar el generador de la clave de «assigned» a «increment» conseguimos que en vez de que tengamos que proporcionar nosotros una clave de forma manual, sea el gestor de la base de datos quien se encargue de gestionarla

El segundo cambio aparece en la línea 17, en donde hemos optado por cambiar el atributo lazy=»true» por lazy=»false». Este atributo se encarga de recuperar los objetos de la base de datos en demanda, esto quiere decir que se van a ir recuperando de la base de datos según vayan haciendo falta. En nuestro caso, teniendo en cuenta el contexto de la aplicación, un servicio web, nos interesa que cuando hagamos una petición, este nos devuelva todos los datos y podamos cerrar la conexión con el servidor.

En cuanto al segundo archivo de mapeado tenemos

Archivo creado por el asistente.

  
  
  
  
      
          
              
              
          
          
              
          
          
              
          
      

Archivo final

  
  
  
  
      
          
              
              
          
          
              
          
          
              
          
          
      

Como vemos solo hemos realizado un único cambio para cambiar el generator de la clave IDPRODUCTO igual que en el caso anterior.

Como vamos a utilizar Spring para inyectar las dependencias, vamos a aprovechar la configuración de Spring para configurar Hibernate y tener la configuración más centralizada.

Para esto, añadimos la librería de Spring a nuestro proyecto. Por lo tanto configuramos el Build Path de nuestro proyecto

Y en «Libraries»

pulsamos en «Add external JAR»

y seleccionamos el jar de Spring.

aceptamos y ya tendremos la librería en el classpath del proyecto

Ahora tenemos que crear el archivo de configuración de Spring. Para ello damos con e botón derecho del ratón y le damos a «New» -> «Other»

sólo que en esta ocasión debemos pinchar en «Spring Bean Configuration File»

Escogemos la carpeta del proyecto como «parent_folder» y le ponemos como nombre «ApplicationContext.xml»

Pinchamos en «Finish» y nos creará un archivo en la raíz del proyecto y nos añadirá otro apartado en nuestro proyecto con el nombre de «Spring Elements»


El contenido de ApplicationContext antes de que lo modifiquemos es:

Archivo creado por el asistente.

  
  
  
  
 

Archivo con las modificaciones para Hibernate

  
  
  
      
           
           
           
           
       
      
      
          
          
              
                com/pruebas/bean/ListaCompra.hbm.xml  
                com/pruebas/bean/Producto.hbm.xml  
              
          
          
              
                true  
                org.Hibernate.dialect.MySQLDialect  
              
          
      
  

Como podemos ver ahora tenemos dos beans en el archivo de configuración.

En el primer bean, con id «pgDataSource», es donde configuramos nuestra conexión con la base de datos. Estamos indicando con la propiedad «driverClassName» que utilice el driver «org.postgresql.Driver» para realizar la conexión con nuestra base de datos. Le indicamos donde está nuestra base de datos con la propiedad url, que en este caso es una base de datos local a la que se accede por el puerto 5432. Y le indicamos las credenciales para el inicio de sesión.

El segundo bean, con id «sessionFactory», es quien nos va a proporcionar a través de «HibernateDaoSupport» el acceso de a la base de datos sin que tengamos que encargarnos nosotros de manejar las sesiones de Hibernate. Indicamos mediante la propiedad «dataSource» que utilice la conexión que hemos configurado en el bean anterior. Con la propiedad «mappingResources» indicamos donde se encuentran los archivos de mapeo que hemos creado anteriormente para que Hibernate pueda relacionar los objetos de la aplicación con las tablas de la base de datos. Y por último, configuramos la propiedad «Hibernate.show_sql» a true, para que nos vaya mostrando por consola las operaciones que va realizando (y así poder depurar con más facilidad).

A continuación nos creamos una interfaz para establecer las operaciones básicas que tiene que realizar un Dao para realizar la persistencia de nuestros objetos.
Tiene los métodos básicos de alta, baja y modificaciones. La interfaz es:

package com.pruebas.dao;  
  
import java.util.List;  
  
import com.pruebas.bean.ListaCompra;  
  
public interface IDao   
{  
    public void save(ListaCompra listaCompra);  
    public void saveOrUpdate(ListaCompra listaCompra);  
    public void saveOrUpdateALl(ListaCompra[] listasCompra);  
    public List All();  
    public ListaCompra getListaCompra(int id);  
    public void delete(int id);  
  
}  

Vemos en la línea 5 que se está importando «com.pruebas.bean.ListaCompra». No es buena idea importar una clase en una interfaz de este estilo que trata de establecer las operaciones básicas de nuesto «Data Source Object», pero creemos que simplifica el entendimiento para este tutorial. Una buena práctica habría sido utilizar genéricos para eliminar el acoplamiento.

Y a continuación la clase que implementa esta interfaz

package com.pruebas.dao;  
  
import java.util.List;  
  
import org.Springframework.orm.Hibernate3.support.HibernateDaoSupport;  
  
import com.pruebas.bean.ListaCompra;  
  
public class HibernateDaoImpl extends HibernateDaoSupport implements IDao{  
  
    public List All() {  
        return (List)getHibernateTemplate().loadAll(ListaCompra.class);  
    }  
  
    @Override  
    public void delete(int id)   
    {  
        Object record = getHibernateTemplate().get(ListaCompra.class, id);  
        getHibernateTemplate().delete(record);  
    }  
  
    public ListaCompra getListaCompra(int id)  
    {  
        return (ListaCompra) getHibernateTemplate().get(ListaCompra.class, id);  
    }  
  
    @Override  
    public void saveOrUpdate(ListaCompra listaCompra)   
    {  
        // TODO Auto-generated method stub  
        getHibernateTemplate().saveOrUpdate(listaCompra);  
    }  
  
    @Override  
    public void saveOrUpdateALl(ListaCompra[] listasCompra)   
    {  
        for(int i=0; i < listasCompra.length; i++)  
        {  
            getHibernateTemplate().saveOrUpdate(listasCompra[i]);  
        }  
    }  
  
    @Override  
    public void save(ListaCompra listaCompra)   
    {  
        // TODO Auto-generated method stub  
        getHibernateTemplate().save(listaCompra);  
    }  
  
} 

Vemos que además de implementar la interfaz "Dao", además hereda de la clase "HibernateDaoSupport". Esta es la manera que tiene Spring de darnos soporte a Hibernate. Mediante la configuración que hemos hecho en "ApplicationContext.xml" y heredando de "HibernateDaoSupport" podemos obtener una sesión de Hibernate para realizar la persistencia de nuestros objetos llamando al método "getHibernateTemplate()".

Además vamos a necesitar poder serializar y deserializar los objetos que tengamos persistidos, ya que estos van a viajar a través de la Internet. Para lograr este objetivo, vamos a utilizar una librería llamada Gson que va a realizar el trabajo por nosotros. Esta librería la podéis descargar de http://code.google.com/p/google-gson/downloads/detail?name=google-gson-1.6-release.zip. Una vez descargada, la tenéis que descomprimir y añadir al classpath del proyecto.

ncluimos en el proyecto dos archivos más, ISerializador.java y SerializadorImp.java,

ISerializador.java

package com.pruebas.util;  
  
public interface ISerializador   
{  
      
    public String Serializar(Object object);      
    public  T Deserializar(String object, Class clase);  
  
} 

SerializadorImp.java

package com.pruebas.util;  
  
import com.google.gson.Gson;  
  
public class SerializadorImp  implements ISerializador{  
  
    private static Gson gson = null;  
      
    public SerializadorImp()  
    {  
        gson = new Gson();  
    }  
  
    @Override  
    public String Serializar(Object objecto)   
    {  
        // TODO Auto-generated method stub  
        return gson.toJson(objecto);  
    }  
  
    @Override  
    public  T Deserializar(String object,Class clase)   
    {  
        // TODO Auto-generated method stub  
        return (T)gson.fromJson(object, clase);  
    }  
      
}

Como vemos, lo único que hace es recubrir al objeto gson para realizar las serializaciones y deserializaciones

A continuación, creamos un controlador que se encargue de gestionar los parámetros que recibimos de la vista y la persistencia de los datos.

package com.pruebas.controller;  
  
import java.util.List;  
  
import com.pruebas.bean.ListaCompra;  
import com.pruebas.dao.IDao;  
import com.pruebas.util.ISerializador;  
  
public class ListaComprasController {  
  
    public IDao dao = null;  
    public ISerializador serializador = null;  
      
    public ListaComprasController()  
    {  
    }  
      
    public void setIDao(IDao dao)   
    {  
        this.dao = dao;  
    }  
      
    public void setISerializador(ISerializador serializador)   
    {  
        this.serializador = serializador;  
    }  
      
    public String getListasCompras()  
    {  
        List listasCompras = dao.All();   
        return serializador.Serializar(listasCompras);  
    }  
      
    public String getLista(int idLista)   
    {  
      
        ListaCompra listaCompra = dao.getListaCompra(idLista);  
        return serializador.Serializar(listaCompra);  
    }  
      
    public void nuevaLista(String jsonListaCompra)   
    {  
        ListaCompra listaCompra = serializador.Deserializar(jsonListaCompra, ListaCompra.class);  
        dao.save(listaCompra);  
    }  
      
    public void guardarLista(String jsonListaCompra)   
    {  
        ListaCompra listaCompra = serializador.Deserializar(jsonListaCompra, ListaCompra.class);  
        dao.saveOrUpdate(listaCompra);  
    }  
      
    public void borrarLista(String jsonListaCompra)   
    {  
        ListaCompra listaCompra = serializador.Deserializar(jsonListaCompra, ListaCompra.class);  
        dao.delete(listaCompra.getIdListaCompra());  
    }  
} 

Lo importante de esta clase es que como vemos en la línea 11 y 12, tenemos dos propiedades, "dao" y "serializador" que utilizamos varias veces en los métodos de la clase sin instanciarlos antes. Esto es posible porque dejamos que Spring haga la inyección de dependencias. Para conseguir esto, modificamos el archivo "ApplicationContext.xml" e incluimos estas líneas.

  
  
  
  
      
  
  
  
      
      

Como vemos, hemos creado tres "beans". El primero, "serializador", es en el que indicamos que implementación queremos para el serializador, en este caso va a pertenecer a la clase "com.pruebas.util.SerializadorImp". El segundo, "dao", es el objeto donde realizaremos la persistencia. Y el tercero, "listaComprasController", es el controlador de la vista, y vemos como inicializamos dos propiedades "IDao" y "ISerializador", con esto conseguimos que en el momento de instanciar el controlador, Spring se encarge de inicializar esos objetos.

A continuación creamos una interfaz que exponga los métodos que va a publicar el servicio web.

package com.pruebas.service;  
  
public interface IListaComprasSW {  
  
    public void nuevaLista(String jsonListaCompra);  
    public void guardarLista(String jsonListaCompra);  
    public void borrarLista(String jsonListaCompra);  
    public String getListas();  
    public String getLista(int idLista);  
} 

Como vemos, vamos a publicar 5 métodos con los que podremos crear nuevas listas de la compra, guardar, y obtener listas. Las típicas funcionalidades de un gestor

Ahora pasamriamos a crear la clase que implemente está interfaz. Ademas de implementar los métodos de la interfaz, añadimos una propiedad "ListaComprasController" que más adelante vemos como será inicializada a través del constructor gracias a Spring.

Antes de desplegar nuestro servicio web, debemos añadir un pará metro a la configuración de Axis2 para permitir servicios rest. El archivo que debemos modificar está en "WebContent\WEB-INF\conf\axis2.xml.

y la línea que hay que añadir es

true

Una vez que tenemos hecho todo esto, vamos a publicar nuestro servicio web. Para esto tenemos que configurar Eclipse para que nos despliegue el servicio web en el servidor TomCat que nos hemos bajado. Entonces pinchamos en la pestaña "Server" en Eclipse y clickeamos con el botón derecho y le damos a "New".

Dejamos las opciones como nos aparecen y le damos a "Finish"

y ya tendremos un servidor en donde desplegar nuestro servicio web

Ahora lo que tenemos que hacer es indicar que clase es la que expone los métodos web. Para hacerlo, nos ponemos encima de la clase que contiene los métodos y pulsamos con el botón derecho y clickeamos en "WebServices" -> "Create Web Services". Nos aparece una pantalla como la siguiente:

Si nos fijamos, por defecto nos ha configurado para ejecutar el servicio con Axis, pero a nosotros nos interesa que sea con Axis2, por lo que clickeamos en "Web Service Runtime: Apache Axis" y en la ventana que aparece seleccionamos Axis2, le damos a "Ok" y a "Finish" con lo que nos levantará Tomcat y nos desplegará nuestro servicio web.

Como estamos utilizando Spring dentro de Axis2, Spring no es capaz de cargar su contexto, con lo que necesitamos modificar un par de archivos más.

Primero modificaremos el archivo web.xml para agregar un listener y poder pasar el contexto de Spring, además de indicarle donde se va a encontrar nuestro contexto (el archivo applicationContext.xml).

Para ello añadimos las líneas que hay a continuación en web.xml

  
    org.Springframework.web.context.ContextLoaderListener  
      
      
     contextConfigLocation  
     /WEB-INF/ApplicationContext.xml  
    

y para que Spring nos inyecte la dependencia de nuestra clase que se encarga de recibir las peticiones Http, añadimos a "ApplicationContext.xml" las siguientes líneas.

  
          
     

Por último debemos modificar un archivo más. Para ello, abrimos el archivo que se encuentra en "WebContent" -> "WEB-INF" -> "services" -> "ListaCompraSW" -> "META-INF" -> "services.xml"

y añadimos las líneas

org.apache.axis2.extensions.Spring.receivers.SpringServletContextObjectSupplier  
   listaCompraSW  
     
         
    

Si ahora abrimos un navegador y nos dirigimos a http://localhost:8080/ListasComprasSW/axis2-web/index.jsp deberíamos ver algo como esto:

y si pinchamos en Services deberemos ver listado nuestro servicio

Con lo que ya tenemos nuestro servicio web 😉

Crear el cliente

Ahora vamos a crear un cliente sencillo en Android que va a consumir nuestro servicio web. La aplicación va a constar de dos activities, cada uno con un listView.

El primer activity es la vista principal en donde podemos ver las listas de la compra recuperadas por la aplicación. Además de poder añadir nuevas listas y especificar la dirección IP en donde se encuentra nuestro servidor.

El segundo activiy contiene un listado de los productos que tiene una lista de la compra.

Main.java

ListaProductos.java

Para rellenar estos los listView de los activities hemos creado dos adapters que se encargaran de rellenar los listview

ListaComprasAdapter.java

ListaProductosAdapter.java

Para acceder al servicio web, que de lo que se trataba el tema en cuestión ;), Creamos nuestro "dao", pero esta vez en vez de usar Hibernate para acceder a una base de datos, utilizamos una conexión HTTP contra el servicio que hemos creado anteriormente

La razón por la que implementa IListaCompraSW, es para asegurarnos que vamos a tener los mismos métodos que el servicio web que hemos implementado anteriormente.

También tendremos que modificar "AndroidManifest.xml" para pedir acceso a internet desde nuestra aplicación e indicarle que la aplicación consta de dos activities.

   
          
      
  
      
          
              
                  
                  
              
          
          
          
          
      
      
      
      
 

Conclusiones

Al usar servicios web REST, vemos que podemos acceder a esa información de una manera muy sencilla y ligera (a través de una petición HTTP), aspecto que nos viene muy bien si el cliente que va a consumir esos datos es un cliente ligero (un móvil en este caso).

A continuación os muestro unas capturas de pantalla de como funciona el invento 🙂 y el código fuente de los dos proyectos 😛

7 COMENTARIOS

  1. Buenas tardes, he leído el tutorial y me parece super, pero hay una cosa que no entiendo. Mi primera pregunta es si la petición HTTP que se hace es por parámetros de búsqueda? por ejemplo comida?
    La segunda pregunta es q si la búsqueda que se realiza se gurda en la base de datos y yo accedo a ella cuando cuando quiera buscar o la búsqueda que se genera se gurda en un XML?

    La búsqueda se realiza es en toda la red? o yo podría darle información de direcciones especificas para que no haga una búsqueda exhaustiva?

    Gracias y espero sus prontas respuestas gracias 🙂

  2. Hola Elena, gracias por comentar.

    En cuanto a la primera pregunta, si te fijas en los distintos métodos que provee el servicio, no tiene ninguno de búsqueda, ten en cuenta que es un servicio muy simplón para realizar un ejemplo. En este ejemplo la única manera que tienes de recuperar una lista en concreto es conociendo su id, a través del método \\\»getLista\\\». La mecánica e la aplicación de ejemplo es: primero recupero todas las listas, con lo que tengo ya todos los ids que me hacen falta, y las muestro por pantalla, y luego según se selecciona una en la pantalla, puedo recuperar toda la información de esa lista porque ya conozco su id. La petición http que se realiza cuando solicitamos una lista en concreto es htt://192.168.7.1/ListaComprasSW/getLista?idLista=1 siendo 1 el identificador de la lista que quieres recuperar.

    En el ejemplo lo único que se guarda en la base de datos es la información referente a la lista de compras y sus productos, y sólo se guarda en la base de datos del servidor. El cliente podría haber guardado los resultados para evitar tener que hacer peticiones al exterior, pero es algo que en el ejemplo no se contempla. Cada vez que hacemos algo con una lista en el cliente, se hace una petición al servidor, ya sea consultar las listas, marcar un producto como cogido, avanzar de la pantalla de listas de compras a la de productos, crear una nueva lista…

    La petición se realiza a una única dirección, que es donde se encuentra el servicio. Si te fijas en la clase \\\»Dao\\\» del cliente (de las últimas que aparecen en el tutorial), verás que hay una propiedad que se llama \\\»urlBase\\\», que es una propiedad que contiene la dirección IP de donde se encuentra el servidor. En los ejemplos que aparecen en el tutorial no se puede ver, pero si has descargado el código, verás que en este caso se ha utilizado las preferencias de android para alojar la url del servidor y la puedes cambiar por la que te interese en cualquier momento.

  3. Hola Francisco , primeramente agradecerte por este gran aporte
    bueno mi consulta es la siguiente , ya tengo todos lo programas con las versiones que nos indicas el tema es cuando le doy en Eclipse \\\»Help\\\» -> \\\»Install New Software\\\» y agrego name: Spring IDE y la ruta http://dist.Springframework.org/snapshot/IDE/nightly obtengo el siguiente mensaje de error que no me deja continuar :
    Cannot complete the install because one or more required items could not be found.
    Software being installed: Spring IDE Core (required) 3.0.0.201206041740-CI-B18 (org.springframework.ide.eclipse.feature.feature.group 3.0.0.201206041740-CI-B18)
    Missing requirement: Spring IDE Spring Meta Data Extension 3.0.0.201206041740-CI-B18 (org.springframework.ide.eclipse.metadata 3.0.0.201206041740-CI-B18) requires \\\’bundle org.springsource.ide.eclipse.commons.core 0.0.0\\\’ but it could not be found
    Cannot satisfy dependency:
    From: Spring IDE Core (required) 3.0.0.201206041740-CI-B18 (org.springframework.ide.eclipse.feature.feature.group 3.0.0.201206041740-CI-B18)
    To: org.springframework.ide.eclipse.metadata [3.0.0.201206041740-CI-B18]

    agradesco de antemano tu aporte

    saludos cordiales
    Adolfo Luna

  4. Hola ado. Gracias a ti por seguirnos.

    Es posible que hayan cambiado de repositorio el plugin de Spring.

    Realmente ese plugin de eclipse no es estrictamente necesario para seguir el tutorial. Sirve para facilitar un poco el manejo de los ficheros de Spring en Eclipse.

    Si escribes los ficheros tal y como se comentan en el tutorial, te debería de funcionar tu servicio web. Cuando tengas que crear el archivo de Spring, basta que crees un archivo con extensión xml y con el nombre que indica en el tutorial (ApplicationContext.xml), y lo pongas bajo la carpeta /WEB-INF/

    Si tienes algún problema para seguir, coméntamelo y te hecho una mano.

  5. Muy buen tutorial! Solo una pregunta, he tratado de hacer lo que explicas en tu tutorial pero usando netbeans. He creado una Web Application pero no se como crear el Web Service de axis2 a partir de las clases de java. Sabes algo al respecto?

  6. Bastante interesante el tutorial, lo estoy terminando de replicar y solo me falta una parte y es en la base de datos, el aplicativo me arroja el siguiente mensaje, es posible que anexes la estructura de la base de datos, muchas gracias.

    Hibernate: select this_.idListaCompra as idListaC1_0_0_, this_.nombre as nombre0_0_, this_.fecha as fecha0_0_ from listacompra this_
    49969 [http-8080-1] WARN org.hibernate.util.JDBCExceptionReporter – SQL Error: 0, SQLState: 42P01
    49969 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter – ERROR: no existe la relación «listacompra»
    Position: 105

  7. Hola Francisco J,

    En primer lugar felicitarte por este fántastico ejemplo que nos ayudan de forma didáctica a todos aquellos que estamos empezando a desarrollar en esta plataforma. Aunque mi comentario es un poco tardío (cuando he comenzado a utilizar servicios web en Android), me estoy encontrando con el siguiente error que no sé solucionar. Consigo arrancar perfectamente el servidor, pero tras intentar añadir o recoger una lista de compra me encuentro con esto:
    [INFO] Root WebApplicationContext: initialization completed in 1868 ms
    [INFO] Deploying module: addressing-1.41 – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/addressing-1.41.mar
    [INFO] Deploying module: metadataExchange-1.41 – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/mex-1.41.mar
    [INFO] Deploying module: ping-1.41 – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/ping-1.41.mar
    [INFO] Deploying module: script-1.41 – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/scripting-1.41.mar
    [INFO] Deploying module: smtpfault – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/smtpfault.mar
    [INFO] Deploying module: soapmonitor-1.41 – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/modules/soapmonitor-1.41.mar
    [INFO] Deploying Web service: ListaCompraSW – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/services/ListaCompraSW/
    [INFO] Deploying Web service: version.aar – file:/D:/Android/Eclipse Android/eclipse_ws/LISTA_COMPRA/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/ListasComprasSW/WEB-INF/services/version.aar
    [ERROR] Exception occurred while trying to invoke service method null
    org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:251)
    at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:283)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:71)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
    at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:136)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:829)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:255)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.PrivilegedActionException: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:239)
    … 23 more
    Caused by: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.apache.axis2.receivers.AbstractMessageReceiver$8.run(AbstractMessageReceiver.java:242)
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
    … 24 more
    [ERROR]
    org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:251)
    at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:283)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:71)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
    at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:136)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:829)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:255)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.PrivilegedActionException: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:239)
    … 23 more
    Caused by: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.apache.axis2.receivers.AbstractMessageReceiver$8.run(AbstractMessageReceiver.java:242)
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
    … 24 more
    [ERROR] Exception occurred while trying to invoke service method null
    org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:251)
    at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:283)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:71)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
    at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:136)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:829)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:255)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.PrivilegedActionException: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:239)
    … 23 more
    Caused by: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.apache.axis2.receivers.AbstractMessageReceiver$8.run(AbstractMessageReceiver.java:242)
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
    … 24 more
    [ERROR]
    org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:251)
    at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:283)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:71)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
    at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:136)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:829)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:255)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.PrivilegedActionException: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:239)
    … 23 more
    Caused by: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.apache.axis2.receivers.AbstractMessageReceiver$8.run(AbstractMessageReceiver.java:242)
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
    … 24 more
    [ERROR] Exception occurred while trying to invoke service method null
    org.apache.axis2.AxisFault
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.receivers.AbstractMessageReceiver.makeNewServiceObject(AbstractMessageReceiver.java:251)
    at org.apache.axis2.receivers.AbstractMessageReceiver.getTheImplementationObject(AbstractMessageReceiver.java:283)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:71)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
    at org.apache.axis2.transport.http.util.RESTUtil.invokeAxisEngine(RESTUtil.java:136)
    at org.apache.axis2.transport.http.util.RESTUtil.processURLRequest(RESTUtil.java:130)
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.processURLRequest(AxisServlet.java:829)
    at org.apache.axis2.transport.http.AxisServlet.doGet(AxisServlet.java:255)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.security.PrivilegedActionException: java.lang.InstantiationException: com.pruebas.service.ListaCompraSW
    at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
    …..

    ¿Sabes a qué se debe?
    Gracias de antemano.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad