Francisco J. Arroyo

Consultor tecnológico de desarrollo de proyectos informáticos.

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/JEE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2011-03-22

Tutorial visitado 13.384 veces Descargar en PDF
Consumir servicio web rest en Axis2 con Android.

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

El código correspondiente a Producto.java es

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

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:

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

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.

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

ISerializador.java

SerializadorImp.java

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.

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.

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

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

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

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 ;)




5. 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.


6. 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 :P



Si queréis descargaros el código fuente de los dos proyectos lo tenéis aquí



A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-10-25-14:18:11

Autor: lumibasqui

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.

Fecha publicación: 2013-05-23-21:58:33

Autor: carlostober

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

Fecha publicación: 2012-09-16-21:13:19

Autor: luisegg

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?

Fecha publicación: 2012-06-06-09:34:01

Autor: fjarroyo

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.




Fecha publicación: 2012-06-05-18:29:50

Autor: ado

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

Fecha publicación: 2011-03-31-12:09:02

Autor: fjarroyo

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.

Fecha publicación: 2011-03-29-20:34:55

Autor: elena

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 :)