Foros del Web » Programación para mayores de 30 ;) » Java »

Como enviar un arreglo de objetos a un WebService

Estas en el tema de Como enviar un arreglo de objetos a un WebService en el foro de Java en Foros del Web. Buenas tardes a todos los foristas. Hace algunos días lancé una pregunta en este mismo foro, el compañero Xerelo me hizo el favor de brindarme ...
  #1 (permalink)  
Antiguo 22/08/2013, 09:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Como enviar un arreglo de objetos a un WebService

Buenas tardes a todos los foristas.

Hace algunos días lancé una pregunta en este mismo foro, el compañero Xerelo me hizo el favor de brindarme su ayuda para responder parcialmente:

http://www.forosdelweb.com/f45/utili...1-4-a-1070180/

La cuestión es la siguiente, necesito hacer un webservice donde se pueda enviar una colección de objetos tipo JavaBean (es decir, una clase solo con getter's y setter's), intenté hacerlo enviando una LISTA de estos objetos, pero por lo que leí, Axis 1.4 no permite el uso de estas estructuras... he intentado hacerlo también con ARREGLOS simples, pero el resultado es el mismo... he intentado registrar el tipo utilizando ArraySerializerFactory pero no doy con una solución.

La pregunta sería si es posible hacer lo que quiero con Axis 1.4 o si necesito utilizar otro framework, y de ser así, cuál me recomiendan utilizar.

De antemano muchas gracias por el apoyo

Saludos
Leo.
  #2 (permalink)  
Antiguo 22/08/2013, 11:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como enviar un arreglo de objetos a un WebService

Hola a todos:

Sigo con las pruebas, pero creo que estoy equivocando la estrategia... espero que me puedan ayudar a encontrar la luz al final del tunel porque sinceramente estoy bastante perdido...

haciendo algunas modificaciones al archivo WSDD y al cliente, he logrado que se invoque el WS, sin embargo, ahora tengo el problema de que no me están llegando los datos... comenzaré otra vez desde el inicio para ver si alguien me puede señalar mi error:

Tengo un JavaBean así:

Código Java:
Ver original
  1. package parametros;
  2. import java.io.Serializable;
  3. public class Persona implements Serializable {  
  4.   private String nombre;
  5.   private String apellido;  
  6.   public String getNombre() {
  7.     return nombre;
  8.   }
  9.   public void setNombre(String nombre) {
  10.     this.nombre = nombre;
  11.   }
  12.   public String getApellido() {
  13.     return apellido;
  14.   }
  15.   public void setApellido(String apellido) {
  16.     this.apellido = apellido;
  17.   }  
  18.   public Persona(){
  19.   }
  20. }

Tengo una clase que recibe un ARREGLO de este tipo y llena una lista, de esta manera:

Código Java:
Ver original
  1. package publicar;
  2. import parametros.Persona;
  3. public class HolaMundo {
  4.   public HolaMundo(){
  5.   }  
  6.   public String[] Saludar(Persona[] personas){
  7.     String[] regresar = new String[personas.length];
  8.     for (int i = 0; i < personas.length; i++) {
  9.       regresar[i] = "Hola " + personas[i].getNombre() + " " + personas[i].getApellido();      
  10.     }
  11.     return regresar;
  12.   }
  13. }

Lo que necesito es hacer este método como WS, y un cliente que lo consuma... en el archivo WSDD tengo lo siguiente:

Código XML:
Ver original
  1. <service name="HolaMundo" provider="java:RPC">
  2.     <parameter name="allowedMethods" value="*"/>
  3.     <parameter name="className" value="publicar.HolaMundo"/>    
  4.     <arrayMapping qname="ns:Personas" xmlns:ns="Personas"
  5.             languageSpecificType="java:parametros.Persona[]"            
  6.             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
  7. </service>

y esto me genera el el siguiente WSDL:

Código XML:
Ver original
  1. <wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8084/WSPruebas/services/HolaMundo" xmlns:intf="http://localhost:8084/WSPruebas/services/HolaMundo" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="Personas" xmlns:tns2="http://parametros" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8084/WSPruebas/services/HolaMundo">
  2. <!--
  3. WSDL created by Apache Axis version: 1.4
  4. Built on Apr 22, 2006 (06:55:48 PDT)
  5. -->
  6. <wsdl:types>
  7. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://parametros">
  8. <import namespace="http://localhost:8084/WSPruebas/services/HolaMundo"/>
  9. <import namespace="Personas"/>
  10. <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
  11. <complexType name="Persona">
  12. <sequence>
  13. <element name="apellido" nillable="true" type="xsd:string"/>
  14. <element name="nombre" nillable="true" type="xsd:string"/>
  15. </sequence>
  16. </complexType>
  17. </schema>
  18. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="Personas">
  19. <import namespace="http://localhost:8084/WSPruebas/services/HolaMundo"/>
  20. <import namespace="http://parametros"/>
  21. <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
  22. <complexType name="Personas">
  23. <complexContent>
  24. <restriction base="soapenc:Array">
  25. <attribute ref="soapenc:arrayType" wsdl:arrayType="tns2:Persona[]"/>
  26. </restriction>
  27. </complexContent>
  28. </complexType>
  29. </schema>
  30. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8084/WSPruebas/services/HolaMundo">
  31. <import namespace="Personas"/>
  32. <import namespace="http://parametros"/>
  33. <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
  34. <complexType name="ArrayOf_xsd_string">
  35. <complexContent>
  36. <restriction base="soapenc:Array">
  37. <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
  38. </restriction>
  39. </complexContent>
  40. </complexType>
  41. </schema>
  42. </wsdl:types>
  43. <wsdl:message name="SaludarRequest">
  44. <wsdl:part name="personas" type="tns1:Personas"/>
  45. </wsdl:message>
  46. <wsdl:message name="SaludarResponse">
  47. <wsdl:part name="SaludarReturn" type="impl:ArrayOf_xsd_string"/>
  48. </wsdl:message>
  49. <wsdl:portType name="HolaMundo">
  50. <wsdl:operation name="Saludar" parameterOrder="personas">
  51. <wsdl:input message="impl:SaludarRequest" name="SaludarRequest"/>
  52. <wsdl:output message="impl:SaludarResponse" name="SaludarResponse"/>
  53. </wsdl:operation>
  54. </wsdl:portType>
  55. <wsdl:binding name="HolaMundoSoapBinding" type="impl:HolaMundo">
  56. <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  57. <wsdl:operation name="Saludar">
  58. <wsdlsoap:operation soapAction=""/>
  59. <wsdl:input name="SaludarRequest">
  60. <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://publicar" use="encoded"/>
  61. </wsdl:input>
  62. <wsdl:output name="SaludarResponse">
  63. <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8084/WSPruebas/services/HolaMundo" use="encoded"/>
  64. </wsdl:output>
  65. </wsdl:operation>
  66. </wsdl:binding>
  67. <wsdl:service name="HolaMundoService">
  68. <wsdl:port binding="impl:HolaMundoSoapBinding" name="HolaMundo">
  69. <wsdlsoap:address location="http://localhost:8084/WSPruebas/services/HolaMundo"/>
  70. </wsdl:port>
  71. </wsdl:service>
  72. </wsdl:definitions>

Ahora bien... hasta aquí creo que todo está correcto, pero al momento de tratar de consumir el WS es donde estoy teniendo problemas... tengo el siguiente código para la invocación:

Código Java:
Ver original
  1. public static void main(String[] args) {
  2.     try {
  3.       String endpoint = "http://localhost:8084/WSPrueba/services/HolaMundo";      
  4.       Service service = new Service();
  5.       Call call = (Call) service.createCall();
  6.       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
  7.       call.setOperationName("Saludar");      
  8.       String[] resultado = null;      
  9.       Persona[] lista = new Persona[2];
  10.       Persona persona = new Persona();
  11.       persona.setNombre("Leonardo");
  12.       persona.setApellido("Córcega");
  13.       lista[0] = persona;
  14.       persona = new Persona();
  15.       persona.setNombre("Josué");
  16.       persona.setApellido("Ufona");
  17.       lista[1] = persona;
  18.      
  19.       QName qname = new QName(endpoint, "Personas");
  20.       call.registerTypeMapping(Persona[].class, qname, new BeanSerializerFactory(Persona[].class, qname), new BeanDeserializerFactory(Persona[].class, qname));    
  21.       resultado = (String[]) call.invoke(new Object[]{lista});
  22.       System.out.println(resultado == null ? "sin invocar" : "Termino!.");
  23.       for (int i = 0; i <= resultado.length - 1; i++) {
  24.         System.out.println("resultado " + String.valueOf(i) + ": ".concat(resultado[i]));
  25.       }
  26.     } catch (Exception e) {
  27.       System.err.println(e.toString());
  28.     }
  29.   }

es decir, creo una arreglo de tipo Persona de dos posiciones, creo dos objetos tipo persona (Leonardo y Josué) y los asigno a cada una de las posiciones del arreglo y hago la invocación...

Al momento de ejecutar la clase, no me marca ningún error, sin embargo al método le llega un objeto vacío, sin ningún elemento... Sinceramente no donde está el error, si en la creación del WS, en la configuración del WSDD o en la forma en que estoy haciendo la invocación del servicio.

Espero que alguno de ustedes me pueda echar un cable, sinceramente estoy bastante perdido con esto.

Saludos
Leo.

Etiquetas: arreglo, axis, objetos, webservice
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:57.