Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/08/2013, 15:03
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Utilizar un JavaBean con Axis 1.4

Buenas tardes a todos los foristas, espero que alguno de ustedes me puedan ayudar con un problema que no puedo resolver.

Estoy haciendo un WebService con Axis 1.4, pero estoy teniendo problemas para poder utilizar Datos complejos, en específico un objeto tipo JavaBean como parámetro, trataré de explicarme.

Estoy tratando de hacer un HolaMundo enviando como parámetro un objeto tipo JavaBean, es decir, tengo una Clase Persona así:

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

En Clase del Web Service, tengo dos métodos, de esta manera:

Código Java:
Ver original
  1. package publicar;
  2.  
  3. import parametros.Persona;
  4.  
  5. public class HolaMundo {
  6.   public HolaMundo(){
  7.   }
  8.  
  9.   public String[] Saludar1(String nombre, String apellido){
  10.     String[] regresar = new String[]{"Hola " + nombre + " " + apellido};
  11.     return regresar;
  12.   }
  13.  
  14.   public String[] Saludar2(Persona persona){
  15.     String[] regresar = new String[]{"Hola " + persona.getNombre() + " " + persona.getApellido()};
  16.     return regresar;
  17.   }
  18. }

Como se observa, la única diferencia entre los métodos Saludar1 y Saludar2 es el objeto que se envía como parámetro. En el cliente, cuando hago la invocación del primer método, lo hago así, y funciona correctamente:

Código MySQL:
Ver original
  1. package ws;
  2. import parametros.Persona;
  3. import org.apache.axis.client.Call;
  4. import org.apache.axis.client.Service;
  5. public class PruebaWS {
  6.   public PruebaWS() {    
  7.   }
  8.   public static void main(String[] args) {
  9.     try {
  10.       String endpoint = "http://localhost:8084/WSHolaMundo/services/HolaMundo";    
  11.       Service service = new Service();
  12.       Call call = (Call) service.createCall();
  13.       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
  14.       call.setOperationName("Saludar1");      
  15.       String[] resultado = null;            
  16.       resultado = (String[]) call.invoke(new Object[]{"Leonardo", "Córcega"});      
  17.       for (int i = 0; i <= resultado.length - 1; i++) {
  18.         System.out.println("resultado " + String.valueOf(i) + ": ".concat(resultado[i]));
  19.       }
  20.     } catch (Exception e) {
  21.       System.err.println(e.toString());
  22.     }
  23.   }
  24. }


Sin embargo, cuando trato de hacer la invocación enviando un objeto Persona me marca un error:

Cita:
java.io.IOException: No serializer found for class parametros.Persona in registry org.apache.axis.encoding.TypeMappingDelegate@1aacd 5f"
La manera en que hago la invocación es la misma que arriba, solo cambio la parte del envío del parámetro:

Código Java:
Ver original
  1. ...
  2.       CALL.setOperationName("Saludar2");
  3.       String[] resultado = null;      
  4.       Persona persona = new Persona();
  5.       persona.setNombre("Leonardo");
  6.       persona.setApellido("Córcega");      
  7.       resultado = (String[]) call.invoke(new Object[]{persona});      
  8.       ....

He leído que tengo que modificar el archivo WSDD para que pueda hacer el casteo del objeto:

http://www.coderanch.com/t/225018/We...io-IOException
http://www.oio.de/axis-wsdd/beanMapping.htm
http://mail-archives.apache.org/[email protected]%3E


Sin embargo no logro dar con la sintaxis correcta, lo he intentado 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="Persona" type="java:parametros.Persona"/>  
  5.   </service>

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="Persona" languageSpecificType=="java:parametros.Persona"/>  
  5.   </service>

Y muchas otras formas, pero con ninguna he logrado hacer correr el ejemplo... Alguno de ustedes tiene idea de lo que puede estar pasando??? cómo o hay algún error en la manera en que estoy invocando el WS?

De antemano muchas gracias por el apoyo.

Saludos
Leo.