Ajax no VRaptor: JSON da maneira fácil

Vamos falar um pouco de web antes que o Paulo Silveira transforme esse blog em um livro de Hibernate!

O Fabio Kung deu a idéia de usar JSON para fazer a estrutura básica de Ajax do VRaptor. O Paulo, que detesta(va) trabalhar com JavaScript e interfaces com o usuário, gostou bastante da maneira simples de se representar objetos com JSON. Ele correu atrás de diversas bibliotecas como a JSON-tools e a JSON-lib mas achou que uma dependência apenas para isso seria muita coisa, já que não haveria a necessidade de consumir JSON como Java, apenas produzir. Ele encontrou um código na internet bem simples, mas quando foi usar descobriu uma série de testes que falhariam, então ele, juntamente com o Nico Steppat, mexeu e criou o próprio JSONWriter do VRaptor, junto com um longo test case.

JSON é uma notação simples para definir uma variável em JavaScript que pode ser facilmente traduzida para um objeto de outras linguagens. Muitos frameworks para AJAX, como o Dojo e o Prototype, consomem mensagens JSON. E agora no VRaptor, dada uma simples classe como essa:

@Component
public class ContatoController {

        private List<User> users = new ArrayList<User>();

        @Remotable
        public void lista() {
                // puxaria do banco
                users.add(new User(1,"Paulo"));
                users.add(new User(2,"Guilherme"));
        }
        
        public List<User> getUsers() {
                return users;
        }
}

Basta você anotar o método como @Remotable e acessar contato.list.ajax.logic pela URL, que o resultado será:

{"users":[{"nome":"Paulo","id":1},{"nome":"Guilherme","id":2}]}

Pronto para ser consumido por um browser! Você pode ver no site mais detalhes sobre o AJAX com o VRaptor.

O Paulo ficou empolgado com a remotabilidade, e agora está implementando o RESTful do VRaptor da mesma maneira: contatos.lista.xml.logic vai te renderizar os mesmos objetos só que em XML! Já está no CVS e estará presente uma versão básica na versão 2.2.4 (assim como integração com Spring). Isso será não só útil para expor serviços, mas também para integrar seus componentes VRaptor com consumidores de XML como o Adobe Flex e o OpenLaszlo. O próximo passo é aceitar as requisições XML e JSON, não só apenas produzi-los.

Dei hoje uma palestra sobre esse assunto no SouJava, fazendo analogias com SOA e Service Component Architecture que o Paulo tanto elogia no Apache Tuscany. Ele quer dirigir o desenvolvimento do VRaptor para esse lado: poder expor facilmente seus componentes web como serviços, facilitando a futura integração e manutenção, dois pontos que nós desenvolvedores sofremos muito atualmente com os sistemas legados.

15 Comentários

  1. Luca Bastos 09/11/2006 at 07:22 #

    Assisti a palestra. Gostei muito da facilidade do JSON e da resposta RESTful. A anotação @Remotable é muito legal. O nome não me agrada 100% mas eu não consegui imaginar algo melhor.

  2. Michael Nascimento Santos 09/11/2006 at 07:29 #

    Eu consigo: @Remote 😀

  3. Thiago Senna 09/11/2006 at 08:20 #

    Olá Guilherme,

    muito legal este recurso. Mas assim como o Luca Bastos, também não achei o nome @Remotable muito legal. No meu caso, ao ver essa annotation, de bate e pronto veio a memória a mesma annotation utilizada no framework Genesis, do Michael.

    Parabéns pelo novo recurso 😉

  4. Luca Bastos 09/11/2006 at 08:29 #

    Michael

    Só que @Remote continua com cheiro de RPC e é nisto que o nome não me agrada. Acho que esta feature do VRaptor também serve para trocar documentos.

    Na verdade o nome deveria significar que a transformação é RESTful, algo mais parecido com @RESTfulmode, @RESTfulstuff ou @RESTfulway

  5. Fabio Kung 09/11/2006 at 15:30 #

    @Remote também poderia significar que a view é remota e por isso a engine vai envi serializar os dados.

  6. Francerjo 10/11/2006 at 06:57 #

    Se o objetivo é “…poder expor facilmente seus componentes ‘web’ como ‘serviços’…”, por que não utilizar somente @WebService ou simplesmente @Service ? Talvez fique mais claro.

  7. Rafael de F. Ferreira 10/11/2006 at 08:13 #

    Acho que remotable é bem adequado. Eu não gosto da idéia de usar uma annotation com REST no nome porque isso não tem nada a ver com REST, que é um estilo arquitetural (por natureza abstrato) centrado no conceito de recurso. Usando esse mecanismo do VRaptor dá facilmente para fazer sistemas não-REST. Se a saída fosse só em xml @POX seria legal.

  8. Luca Bastos 13/11/2006 at 15:41 #

    Vale a pena ver como o Xfire/CXF está encarando a questão de serviços via REST/JSON lá no blog do Dan Diephouse (http://netzoid.com/blog)

    Quanto mais estudo Web services, mais fã fico das soluções REST (e porque não dizer, JSON).

  9. Luca Bastos 13/11/2006 at 16:10 #

    Procês o “o” que ficou faltando em netzooid. 😉

  10. Paulo Silveira 13/11/2006 at 19:02 #

    Ok ok! O nome da anotacao parece nao ter saido a melhor do mundo. Talvez @Service ou @Serviceable (?) ficasse melhor.

  11. Luca Bastos 13/11/2006 at 20:10 #

    ser·vice·a·ble
    adj.
    1. Ready for service; usable: serviceable equipment.
    2. Able to give long service; durable: a heavy, serviceable fabric.
    .
    Fonte: http://www.thefreedictionary.com/serviceable
    .
    (O The Free Dictionary é REST 🙂 )
    .
    A discussão agora precisaria de um linguista.
    .
    Eu gosto mais de @Serviceable mas depois de tanto papo já não sei mais se vale a pena trocar de nome, até porque reparei que na versão atual 2.2.3 a annotation @Remotable já está lá.

  12. Diego Pires Plentz 26/11/2006 at 13:18 #

    Por mais que já esteja lá Luca, um refactoring sempre cai bem.

    “Se é para o bem e felicidade da nação, digam que refatoro!”

  13. Thiago Roberto Gaspar Pinto 10/10/2007 at 14:10 #

    Por favor, eh soh um nome… Sabemos q @Remotable irá disponibilizar informação de maneira remota e pronto, seja em json ou xml… levar seus criadores a um refactory seria frescura demais pessoal…

    Tah ótimo @Remotable

  14. Neyvo 23/07/2008 at 13:04 #

    No vraptor tem algum propriedade para alterar o tamanho do upload do MultipartRequestInterceptor? Tive que alterar o codigo fonte do vraptor para poder alterar esse valor.

  15. Tucano 31/01/2011 at 11:37 #

    O link do “mais detalhes sobre o AJAX com o VRaptor” direciona para um endereço de página inixistente

Deixe uma resposta