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

Utilizar un JavaBean con Axis 1.4

Estas en el tema de Utilizar un JavaBean con Axis 1.4 en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 20/08/2013, 15:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.
  #2 (permalink)  
Antiguo 21/08/2013, 00:41
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Utilizar un JavaBean con Axis 1.4

Un webservice no es más que una llamada a un objeto remoto, donde la información se pasa en forma de texto plano y XML.

Te falta un paso, que es el que Axis pueda convertir un objeto a XML.

http://stackoverflow.com/questions/6...d-using-jaxrpc
http://forums.devx.com/showthread.ph...rializer-found...

Con otros frameworks es mucho más sencillo, pero el hecho de que sea RPC dificulta las cosas.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 21/08/2013, 10:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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

Etiquetas: axis, clase, javabean, string
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 14:17.