Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/08/2013, 10:37
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: Utilizar un JavaBean con Axis 1.4

@Xerelo:

Muchas gracias por las ligas, me fueron de gran utilidad!!!... he logrado invocar el WebService enviando un objeto Personas, el archivo WSDD quedó así:

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.     <beanMapping qname="ns:local" xmlns:ns="Persona" languageSpecificType="java:parametros.Persona"/>
  5. </service>

Y la invocación quedó así:

Código Java:
Ver original
  1. String endpoint = "http://localhost:8084/WSPruebas/services/HolaMundo";      
  2.       Service service = new Service();
  3.       Call call = (Call) service.createCall();
  4.       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
  5.       call.setOperationName("Saludar2");      
  6.       String[] resultado = null;      
  7.       Persona persona = new Persona();
  8.       persona.setNombre("Leonardo");
  9.       persona.setApellido("Córcega");
  10.       QName qname = new QName(endpoint, "Persona");      
  11.       call.registerTypeMapping(Persona.class, qname, new BeanSerializerFactory(Persona.class, qname), new BeanDeserializerFactory(Persona.class, qname));
  12.       resultado = (String[]) call.invoke(new Object[]{persona});

Con esto obtuve el resultado esperado. Sin embargo ahora quiero complicar un poco más esto jejejejejeje, la idea ahora sería enviar una LISTA de PERSONAS. Sin embargo traté de hacer lo mismo, pero me marca el mismo error. Lo que hice fue lo siguiente:

Creé una clase JAVABEAN con la siguiente estructura:

Código Java:
Ver original
  1. package parametros;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. public class Personas implements Serializable{
  5.   private List<Persona> personas;
  6.   public List<Persona> getPersonas() {
  7.     return personas;
  8.   }
  9.   public void setPersonas(List<Persona> personas) {
  10.     this.personas = personas;
  11.   }  
  12.   public Personas(){
  13.   }  
  14. }

Es decir, simplemente genero una Lista de PERSONAS (La clase que utilicé en el ejemplo anterior).

Modifiqué mi archivo WSDD para especificar la nueva clase que quiero mapear:

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.     <beanMapping qname="ns:local" xmlns:ns="Personas" languageSpecificType="java:parametros.Personas"/>
  5. </service>

Y modifiqué la manera de invocar el WS... lo que hago es lo siguiente:

Código Java:
Ver original
  1. String endpoint = "http://localhost:8084/WSPruebas/services/HolaMundo";
  2.      
  3.       Service service = new Service();
  4.       Call call = (Call) service.createCall();
  5.       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
  6.       call.setOperationName("Saludar3");      
  7.       String[] resultado = null;      
  8.       List<Persona> lista = new ArrayList<Persona>();
  9.       Personas personas = new Personas();
  10.      
  11.       Persona persona = new Persona();
  12.       persona.setNombre("Leonardo");
  13.       persona.setApellido("Córcega");
  14.       lista.add(persona);
  15.       persona = new Persona();
  16.       persona.setNombre("Josué");
  17.       persona.setApellido("Ufona");
  18.       lista.add(persona);
  19.      
  20.       personas.setPersonas(lista);
  21.      
  22.       QName qname = new QName(endpoint, "Personas");      
  23.       call.registerTypeMapping(Persona.class, qname, new BeanSerializerFactory(Personas.class, qname), new BeanDeserializerFactory(Personas.class, qname));
  24.       resultado = (String[]) call.invoke(new Object[]{personas});

Es decir, creo una Lista de personas, agrego dos personas (leonardo y Josué) y Creo un objeto del mismo tipo que está definido el método Saludar3...

En el QNAME le indico que el nombre del elemento a mapear es PERSONAS y en los objetos para serializar y deserializar le indico que mi clase base es la lista de personas... Sin embargo, cuando se hace la invocación, me marca el mismo error:

Código:
java.io.IOException: No serializer found for class parametros.Personas in registry org.apache.axis.encoding.TypeMappingDelegate@12922f6
¿Estoy haciendo algo mal? o me falta considerar alguna otra cosa... De antemano agradezco cualquier ayuda u observación.

Saludos
Leo.

Última edición por leonardo_josue; 21/08/2013 a las 13:52