Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/08/2013, 11:47
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.