Como retornar una lista desde un web service o desde un RMI (Spring Remoto)
Buenas tardes compañeros de la comunidad.
Mi pregunta es para saber si existe la forma de retornar una lista desde un web service.
Lo que pasa es que estoy tratando de migrar algunos módulos de un sistema a un web service; y no puedo cambiar la estructura del sistema, por lo que lo que tengo que hacer es que se adecue al sistema.
Quería retornar una lista de tipo:
En el que hay varios tipos de datos como un arreglo bidimensional, una cadena, un boleano, y un entero (en la lista de retorno).
al tratar de retornarlo desde el web service me arroja errores tipo : java.rmi.UnmarshalException
y por lo mismo me vi en la necesidad de retornar la lista desde una aplicacion con RMI de Spring Remoto, y tampoco funciona, el error es el mismo.
Alguna sugerencia???
Gracias.
- Inicie sesión o regístrese para enviar comentarios
Re: retornar una lista
▲ ¿A qué te refieres exactamente?
A que tengo que devolver la lista
A que debo de devolver en la lista los datos que comente anteriormente en una sola conexión al WS, y en el LinkedList.
de modo que en una sola petición al WS necesito retornar una lista donde se encuentran un arreglo bidimensional, una cadena, un booleano y una arreglo normal (unidimensional).
Y la forma en que se debería de retorna es en el tipo de lista LinkedList.
Gracias!!!
Re: debo de devolver
¿Necesariamente tiene que ser una lista? Si tú codificas la implementación del servicio (service implementation class), ¿acaso no podrías generar el cliente?
JAX-WS utiliza JAX-B para serializar/deserializar las peticiones/respuestas. Que una operación (
) devuelva una lista no está soportado directamente, aunque sí un bean con una lista de un tipo concreto como miembro.
Gracias por tu respuesta
Si tiene que ser una lista, ya estoy haciendo la implementación del web service desde un cliente, pero al momento de querer devolver la lista salta un error que era el que comentaba anteriormente, y pues el problema con lo que dices de serializar es que este modulo no usa clases y objectos, sino devuelve los datos para realizar un catálogo; es por eso que tiene que ser de ese modo.
Esto es lo que debería de devolver la lista (contenido dinámico):
- Object[][] modelTable -->es un array bidimensional donde se contiene la tabla a consultar.
- String[] encabezado = new String[n] --> es un arreglo simple
- Un boleano (se usa como badera, pero a fuerza tengo que regresarlo en la lista)
- Un mensaje de tipo String
Y pues no usa objectos (por eso no puede generar un bean) y pues si te preguntas por que no lo hago de otro modo, es por que utiliza un framework y eso obliga a hacerlo así.
Gracias.
Lo retornas asi
Si retornas un list en cliente debe aceptar un list
en lo personal estoy programando una aplicacion en RMI y hago los retornos de JTableModel, ArrayList, JComboBoxModel y trabajo bien
por ejemplo quiero retornar un ArrayList lo tengo de la siguiente manera
interfas de la aplicacion esta de esta manera
en donde se impleta esta de este modo
el cliente lo resive de esta forma
RMI
Bueno de hecho al ver que con el web service no lo podía retornar (la lista) traté de retornarlo con el RMI de Spring Remote, pero me marca el mismo error, y pues estoy tratando de retornar dentro de la lista también un JTableModel pero me marcaba error: java.rmi.UnmarshalException
Y me pedía que lo serialice y lo hice pero tampoco me funcionó.
Y la forma como lo hiciste es con RMI nativa de java (son Spring ni nada)???
Lo preguntaba por que si es con Spring se necesita configurar un archivo y me podría servir para verificar si lo estoy heciendo bién.
Gracias por tu respuesta.
pon tu codigo
Aver pon tu codigo.. como lo haces.
a lo mejor asi se puede checar donde esta el error, a lo mejor es algo pequeño..
Capa de abstracción
Si tienes un sistema heredado y quieres integrarlo con otros sistemas, necesitas construir una capa de abstracción (en rojo en la siguiente imagen) para exponerlo como un servicio web:
No es necesario que esta capa de abstracción esté construida en el mismo lenguaje. Algo similar hacen los Enterprise Service Bus (ESB): exponen tal sistema heredado como un servicio.
P.D. En mi opinión, en estos días, RMI es una solución para salir del paso.
~~~
Ok gracias
lo siento pero no puedo pegar código aqui, por que es de la empresa donde trabajo.
Solo puedo decir que estoy tratando de retornal lo que mencionaba anteriormente.
Pero aquí pongo el pseudocódigo.
Existe un método:
Pero cuando quiere devolver el pojo o resultado el web service truena y me carca el error
que había mencionado anteriormente donde me indica que no se pudo generar el XML del
return; es decir que no logra devolver nada.
-------------------------------------------------------
Gracias por su ayuda.
pon el codigo
aver porque no pones el codigo completo donde quieres retornar el modelo de la tabla
Modelo
Este es el modelo de la tabla:
y el contenido interno (arreglo bidimensional que se pone en el modelo lo obtiene de una serie de procedimientos).
Gracias por tu ayuda.
Analisis
tu quieres retornar todos estos datos
bueno este no entiendo realmente que es lo que vas a hacer
creo que como esta basado en web o webservice es totalmente diferente la cosa
luego siguen mas datos, asi viendolo veo que quieres retornar todo una tabla
veo que tu quieres mandar el encabezado que es un arreglo
luego veo que tambien esta este
que incluira el encabezado...
dato1 | dato 2 | dato3 | dato4 |
dato5 | dato 6 | dato7 | dato8 |
dato9 | dato 10 | dato11 | dato12 |
dato13 | dato 14 | dato15 | dato16 |
creo que es lo quieres obtener el final desde tu cliente
bueno te puedo dar la idea, pero esto yo lo hago con rmi programa en escritorio
en el servior va esto
el que immplementa
en el lado del cliente esta de esta forma
bueno yo lo hago de esa forma....
pero como tu dice en
desde un web service o desde un RMI (Spring Remoto) a de ser otro rollo
igual si se puede retornar un DefaultTableMode se puede retornar el arreglo bidimencional
con esto te puede dar una idea..
serialización
La lista en sí es serializable, pero tienes que asegurarte que todos los elementos de la misma sean a su vez serializables.
Sip es correcto
Pero seria serializar tanto la clase que regresa (web service o rmi) y la que hace la petición???
Son todas las clases que usan la clase que genera la lista verdad??? Es decir si esa clase usa otras clases también tiene que
serializarse ???
Y en la clase que hace la petición al Web Service o RMI debe de serializarse??? y también sus clases que utiliza??
SI deseo hacer lo que mencione anteriormente que es mejor (RMI o un WS)???
no
La clase que publica el web service no tiene por qué ser serializable. Ni la clase que lo invoca. Pero todos los objetos que se pasan como parámetros en la invocación, y todo el gráfico de objetos en la respuesta, deben ser serializables.
Como dicen en esta respuesta
Como dicen en esta respuesta de stackoverflow
fuente
Si es standalone local y una aplicación pequeña tomaría sentido usar RMI, de lo contrario un Web Service
hay otras opciones
No todo son web services. Todo mundo habla maravillas de los web services, y pues de manera abstracta, son una buena opción, pero el diablo está en las implementaciones. SOAP-RPC en particular es muy ineficiente y hay muchos web services muy mal implementados no sólo internamente sino que sus interfaces son bastante ineficientes, mal diseñadas.
Ok, entiendo que una
Ok, entiendo que una "ventaja" es la interoperabilidad que ofrecen los web services pues RMI no era tan interoperable pero con eso de que ya soporta IIOP que era un protocolo que manejaba CORBA pero pues nunca llegue a utilizar o implementar algo con esa arquitectura, no se si todavía aplique porque en sus comienzos RMI solo soportaba JRMP, esto es cierto ?
Por interoperabilidad me refiero a esto:
RMI permite comunicar aplicaciones java to java (unicamente java)
Web Service comunicar java to X(.net, perl, python, etc ...) o viceversa
Una de las otras opciones que le propones seria hacer un modelo Cliente-Servidor con sockets e hilos ?
Exacto
Para comunicación entre aplicaciones, una muy buena opción es manejar comunicación asíncrona en un socket. Puedes usar netty de cada lado para simplificar las cosas.
Y con eso puedo??
Y con eso puedo lograr lo que comentaba, el envio de informacion de cualquier tipo??
O es más para una comunicacion cliente-servidor (envion de datos a través de sockets)
Gracias por su ayuda.
envío de datos
Pues a fin de cuentas es envío de datos. RMI es una manera de enviar datos entre distintos procesos Java; a fin de cuentas, es una abstracción sobre sockets y codificación de objetos serializables.
Bueno eso si
Tienes razón, yo lo trate de hacer con Spring Remoto (RMI) pero me marca error de marshalling o algo así.