En nuestro blog queremos explicar las cosas que nos pasan, los proyectos que realizamos, compartir nuestra experiencia como empresa para aprender de la experiencia de nuestros lectores. Creemos que compartir un proyecto es mucho más interesante que guardarlo en un cajón secreto.

blog


JSON-RPC-Java: devolviendo objetos complejos: Beans, Lists, Maps y Sets

JSON-RPC-Java permite, como comentamos en el post anterior, la comunicación transparente entre el código JavaScript y Java.

Otra de las características que hacen tremendamente interesante a esta tecnología es el tratamiento que hace a los objetos devueltos. Esta librería es capaz de serializar los objetos Java y de deserializarlos como objetos JavaScript. Así ahorramos el tiempo necesario para determinar el formato de la información a enviar, siendo innecesario definir esquemas para nuestros XML o JSON como hacíamos sin JSON-RPC-Java.

Devolviendo Beans

Un Bean (o JavaBean) es un objeto Java que cumple las siguientes características:

  • Implementa un constructor sin parámetros.
  • Sus atributos son accesibles vía getters y setters.
  • Implementa la interfaz Serializable.

Podéis encontrar más información en la Web de esta tecnología.

Con JSON-RPC-Java, si una función de un objeto registrado devuelve un Bean este se serializa y se envia. De tal forma que podremos acceder a el como si se tratara de un objeto JavaScript.

Por ejemplo, un objeto de la siguiente clase:

public class Ejemplo implements Serializable {

private int id;
private String nombre;
public Ejemplo() {
}
public int getId() {

return id;

}
public void setId(int id) {

this.id = id;

}
public String getNombre() {

return nombre;

}
public void setNombre(String nombre) {

this.nombre = nombre;

}

}

Al ser devuelto y serializarse, el JSON que recibiria nuestra página seria:

{

"javaClass":"com.ateneaTech.Ejemplo",
"id":"12",
"nombre":"Un ejemplo"

}

Así, de forma transparente (sin tener que hacer el eval con lo que nos retorne la función) si la función foo devolviera un objeto de la clase Ejemplo podemos hacer:

var bar = jsonrpc.ejemplo.foo()
alert(bar.nombre);

Devolviendo colecciones de objetos: Lists, Maps y Sets

JSON-RPC-Java es capaz de serializar tambien las colecciones incluidas en java.util. concretamente puede serializar las diferentes colecciones que implementen las interfaces List, Set y Map.

En el primer caso, los List, el JSON que genera y evalua es de la forma:

{

"javaClass": "java.util.ArrayList",
"list": [0, 1, 2, 3, 4]

}

En el segundo, en el caso de los Set, el JSON es:

{

"javaClass": "java.util.HashMap",
"map": {"foo key": "foo value"}

}

Y en el tercero y último, los Map, es:

{

"javaClass": "java.util.HashSet",
"set": {"foo key": "foo key"}

}

De esta forma podemos acceder a grandes cantidades de información sin tener que diseñar ningun mecanismo de comunicación. JSON-RPC-Java se encargará de ello.

Si tenéis alguna pregunta no dudéis en comentar :)

menéame

14 Responses to “JSON-RPC-Java: devolviendo objetos complejos: Beans, Lists, Maps y Sets”

  1. sdarknot Says:

    sorry peron no tienes un ejemplo el cuyal pueda ver o revisar con mas detalle eske no soy bueno en javascript pero si lo soy
    en java y me parece interesante esto pues espero tu respuesta desde ya gracias bye

  2. becario_precario Says:

    Hola,

    Podeís poner un ejemplo completo para ver como es el código en Javascript que hay que utilizar para recoger un ArrayList????

    Muchas gracias

  3. manuel Says:

    Hola,

    La función en Javascript que estoy utilizando para capturar el ArrayList es esta:

    function mostrarListaEjemplos(){

    var ejemplos = jsonrpc.dev.listaEjemplos();

    alert(”EJEMPLOS: ” + ejemplos[3]);
    }

    El método listaEjemplos() me devuelve un ArrayList de 10 posiciones con String. Al ejecutar el alert solo se muestra “undefined” sin dar ningún error de Javascript.

    ¿Por qué puede ser esto?

    Gracias por su apoyo

  4. luis Says:

    Hola a todos,

    sdarknot y becario_precario: proto os publicaremos un ejemplo.

    manuel: lo que devuelve jsonrpc no es una array directamente, sino un objeto javascript que contiene el array con la forma que comento en el articulo para las lists, asi, para que funcionara, tu código tendría que ser:

    function mostrarListaEjemplos(){
    var ejemplos = jsonrpc.dev.listaEjemplos();
    alert(”EJEMPLOS: ” + ejemplos.list[3]);
    }

    Espero que te sea de ayuda.

    Gracias por comentar a los tres :)

  5. manuel Says:

    Muchisimas gracias me estaba volviendo loco, no había caido en ese importante detalle. Todo funciono a la perfección!!!

    Me parece una verdadera maravilla

    De nuevo gracias por su apoyo

  6. villamx Says:

    Hola, tengo algo de experiencia en AJAX y Struts. Implemente JSONRequest y JSON-RPC. Lo malo de JSONRequest fue que al enviar demaciada información despues de 15000 caracteres lo demas era basura, esto en un renglon de un arralist. Lo que no me gusto de JSON-RPC es que tienes que publicar un servlet y darle chance desde JavaScript poder manipular los metodos de mis clases, ademas de que no supe como enviarle parametros como un arraylist, ya que no hay ejemplos de como hacerlo o implementarlo, solo dicen que esta bien bonito y facil de usar, ademas si uso Mozilla Firefox sale un error “Permiso denegado” ya que uso una arquitectura MVC. Espero me puedas proporcionar un ejemplo con esta problematica. Saludos a todos.

  7. becario_precario Says:

    Hola,

    Me gustaría saber cual es la síntaxis en JavaScript para recuperar el valor contenido en un hashmap. Por ejemplo, si tengo una función que me devuelve un hashmap, y sólo me quiero quedar con el valor del atributo “x”.

    Muchas gracias.

  8. josue Says:

    Hola:
    ya estube navegando un rato por la web, pero como puedo relacionar js-ext, JSON-RPC-Java gracias, ;-)

  9. David Says:

    como podria utilizar los campos nombre y idCliente para formar un combobox…. con la siguiente cadena???

    {”id”:2,”result”:{”javaClass”:”java.util.ArrayList”,”list”:[{”nombre”:”Avanzit”,”idCliente”:1,”javaClass”

    :”com.qo.campei.dao.beans.BDClientePeticionBean”},{”nombre”:”Lucent”,”idCliente”:2,”javaClass”:”com.qo

    .campei.dao.beans.BDClientePeticionBean”}]}}

    un saludo

  10. luis Says:

    Hola David!

    HTML no dispone de controles “combobox”, en todo caso lo que deberias intentar crear es un “select”. El control “combobox” es aquel que permite tanto seleccionar (como un “select”) como introducir texto manualmente (como un “textfield” o “input text”), se usa mucho en los sistemas operativos ya que es muy usable, pero no forma parte del estándar HTML.

    Es complicado poblar un campo de tipos “select”, pues diferentes navegadores utilizan diferentes métodos para ello. No forma parte del ámbito de este articulo responder a ese tipo de dudas. Igualmente, si no lo utilizas ya, te recomiendo que utilices un framework JavaScript como jQuery,dojo o prototype que te facilitará la vida, entre otras cosas, para tareas como estas.

    Para extraer la información que necesitas para poblar el select, debes hacer algo similar a (en pseudo-código, no en JavaScript):

    var data = eval(jsonRpcData); //donde jsonRpcData contiene la cadena que me has indicado.
    var list = data.result.list;
    var listLength = list.length;
    for (var i = 0; i < listLength; i++) {
    var listElement = list[i];
    var nombre = listElement.nombre;

    // poblar el select como hayas decidido, insisto que mil veces mejor con un framework.

    }

    Gracias por comentar!

  11. David Says:

    Hola Luis

    He seguido tu consejo. he logrado formar un select en jsp, tras muchos intentos y desesperaciones lo he conseguido.
    lo que tengo ahora entre manos es que sea dependiente de otro combobox. Para ello tengo que hacer otra llamada a jsonRpc…

    y es aqui donde vuelven a aparecer los problemas, no se porque pero me salta el siguiente error.
    uncaught exception: JSONRpcClientException: method not found (session may have timed out)
    el mensaje es el siguiente: {”id”:2,”error”:{”code”:591,”msg”:”method not found (session may have timed out)”}}

    los metodos que estan publicados son estos
    {”id”:1,”result”:[
    “contactoRpc.obtenerContactoPorIdRpc”,
    “contactoRpc.obtenerClientesRpc”,
    “contactoRpc.obtenerDireccionCliente”,
    “contactoRpc.obtenerContactosRpc”,
    “contactoRpc.obtenerListaClientesRpc”]}

    y cuando intento acceder a obtenerContactosRpc me devuelve el error. Ni idea a que se puede deber. Solo puedo consultar 2 de los 5 metodos.

    Gracias de nuevo por los comentarios y un saludo

    alguna idea???

  12. David Says:

    Creo que ya esta arreglado. Faltaba de enviar los parametros. un saludo

  13. Marly Says:

    Well said.

  14. felipe escobar Says:

    hey all.
    Tengo una pregunta
    Tengo un objeto, que recibo con JSON, que es una lista de objectos, que tienen una propiedad, que es una lista de otros objetos.

    Si intento algo como esto:
    //recogo la lista princilal
    var lstRoot = message.retValue;
    //recogo el primer objeto de la lista
    var objRoot = listCisRoot.list[0];

    var listaHijos=new Array();
    //recogo la propiedad hijos, que en el objeto java es una propiedad List, con sus getters y setters.
    listaHijos=ciRoot.hijos;

    Esto me devuelve un error. La lista es null.

    ALguien sabe que problema puede haber?

Leave a Reply