Caelum - Ensino e Inovação | Explore o poder de Java e Scrum

Ajax no VRaptor: JSON da maneira fácil

Por Guilherme Silveira em 08/11/06

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.

14 Comments »

  1. 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.

    Comment by Luca Bastos — November 9, 2006 @ 7:22 am

  2. Eu consigo: @Remote :-D

    Comment by Michael Nascimento Santos — November 9, 2006 @ 7:29 am

  3. 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 ;)

    Comment by Thiago Senna — November 9, 2006 @ 8:20 am

  4. 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

    Comment by Luca Bastos — November 9, 2006 @ 8:29 am

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

    Comment by Fabio Kung — November 9, 2006 @ 3:30 pm

  6. 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.

    Comment by Francerjo — November 10, 2006 @ 6:57 am

  7. 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.

    Comment by Rafael de F. Ferreira — November 10, 2006 @ 8:13 am

  8. 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).

    Comment by Luca Bastos — November 13, 2006 @ 3:41 pm

  9. Procês o “o” que ficou faltando em netzooid. ;)

    Comment by Luca Bastos — November 13, 2006 @ 4:10 pm

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

    Comment by Paulo Silveira — November 13, 2006 @ 7:02 pm

  11. 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á.

    Comment by Luca Bastos — November 13, 2006 @ 8:10 pm

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

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

    Comment by Diego Pires Plentz — November 26, 2006 @ 1:18 pm

  13. 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

    Comment by Thiago Roberto Gaspar Pinto — October 10, 2007 @ 2:10 pm

  14. 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.

    Comment by Neyvo — July 23, 2008 @ 1:04 pm

RSS feed for comments on this post. TrackBack URL

Leave a comment



Caelum | Ensino e Inovação
São Paulo: Rua Vergueiro, 3185, cj. 87, próximo ao Metrô Vila Mariana   |   Tel. (11) 5571-2751
Rio de Janeiro: Rua Senador Dantas, 80, cj. 307/308 - Centro   |   Tel. (21) 2220-4156 ou 2297-0033