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 originalpackage parametros;
import java.io.Serializable;
return nombre;
}
public void setNombre
(String nombre
) { this.nombre = nombre;
}
return apellido;
}
public void setApellido
(String apellido
) { this.apellido = apellido;
}
public Persona(){
}
}
Tengo una clase que recibe un ARREGLO de este tipo y llena una lista, de esta manera:
Código Java:
Ver originalpackage publicar;
import parametros.Persona;
public class HolaMundo {
public HolaMundo(){
}
public String[] Saludar
(Persona
[] personas
){ for (int i = 0; i < personas.length; i++) {
regresar[i] = "Hola " + personas[i].getNombre() + " " + personas[i].getApellido();
}
return regresar;
}
}
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<service name="HolaMundo" provider="java:RPC">
<parameter name="allowedMethods" value="*"/>
<parameter name="className" value="publicar.HolaMundo"/>
<arrayMapping qname="ns:Personas" xmlns:ns="Personas"
languageSpecificType="java:parametros.Persona[]"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</service>
y esto me genera el el siguiente WSDL:
Código XML:
Ver original<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">
<!--
WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)
-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://parametros">
<import namespace="http://localhost:8084/WSPruebas/services/HolaMundo"/>
<import namespace="Personas"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="Persona">
<sequence>
<element name="apellido" nillable="true" type="xsd:string"/>
<element name="nombre" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="Personas">
<import namespace="http://localhost:8084/WSPruebas/services/HolaMundo"/>
<import namespace="http://parametros"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="Personas">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="tns2:Persona[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8084/WSPruebas/services/HolaMundo">
<import namespace="Personas"/>
<import namespace="http://parametros"/>
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ArrayOf_xsd_string">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="SaludarRequest">
<wsdl:part name="personas" type="tns1:Personas"/>
</wsdl:message>
<wsdl:message name="SaludarResponse">
<wsdl:part name="SaludarReturn" type="impl:ArrayOf_xsd_string"/>
</wsdl:message>
<wsdl:portType name="HolaMundo">
<wsdl:operation name="Saludar" parameterOrder="personas">
<wsdl:input message="impl:SaludarRequest" name="SaludarRequest"/>
<wsdl:output message="impl:SaludarResponse" name="SaludarResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HolaMundoSoapBinding" type="impl:HolaMundo">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Saludar">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="SaludarRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://publicar" use="encoded"/>
</wsdl:input>
<wsdl:output name="SaludarResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8084/WSPruebas/services/HolaMundo" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HolaMundoService">
<wsdl:port binding="impl:HolaMundoSoapBinding" name="HolaMundo">
<wsdlsoap:address location="http://localhost:8084/WSPruebas/services/HolaMundo"/>
</wsdl:port>
</wsdl:service>
</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 originalpublic static void main
(String[] args
) { try {
String endpoint
= "http://localhost:8084/WSPrueba/services/HolaMundo"; Service service = new Service();
Call call = (Call) service.createCall();
call.
setTargetEndpointAddress( new java.
net.
URL(endpoint
) ); call.setOperationName("Saludar");
Persona[] lista = new Persona[2];
Persona persona = new Persona();
persona.setNombre("Leonardo");
persona.setApellido("Córcega");
lista[0] = persona;
persona = new Persona();
persona.setNombre("Josué");
persona.setApellido("Ufona");
lista[1] = persona;
QName qname = new QName(endpoint, "Personas");
call.registerTypeMapping(Persona[].class, qname, new BeanSerializerFactory(Persona[].class, qname), new BeanDeserializerFactory(Persona[].class, qname));
System.
out.
println(resultado
== null ? "sin invocar" : "Termino!."); for (int i = 0; i <= resultado.length - 1; i++) {
System.
out.
println("resultado " + String.
valueOf(i
) + ": ".
concat(resultado
[i
])); }
System.
err.
println(e.
toString()); }
}
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.