HATEOAS com VRaptor 3.3.1 - Serializando os links

35 views
Skip to first unread message

AC de Souza

unread,
Jul 7, 2011, 4:10:14 PM7/7/11
to caelum-vraptor-dev
Caros,

Seguindo a conversa que tive com o Lucas Cavalcanti(http://
www.guj.com.br/java/246663-hateoas-com-vraptor-331---serializando-os-links)
no GUJ, estou precisando implementar a serialização dos links no
formato JSON.

Já baixei o VRaptor, mas não me sinto confortável em desenvolver no
branch master. Então, pensei em começar um branch a partir da tag
3.3.1.
Até aí tudo bem, iria criar um branch 3.3.2, mas vi que já tinha uns
commits neste sentido.

Alguma sugestão ou crítica sobre de onde iniciar o branch para
desenvolver o suporte a serialização de links no formato JSON?

[],
AC

Lucas Cavalcanti

unread,
Jul 7, 2011, 4:13:18 PM7/7/11
to caelum-vr...@googlegroups.com
Olá,

por que não fazer uma branch a partir da master?
isso facilita o merge depois, pois dá menos conflitos

[]'s

2011/7/7 AC de Souza <ac.de...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor-dev" group.
To post to this group, send email to caelum-vr...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vraptor-...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor-dev?hl=en.


Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 7, 2011, 4:40:24 PM7/7/11
to caelum-vr...@googlegroups.com
Lucas,

Queria ter certeza de que poderia gerar uma versão, 3.3.2 por exemplo, sem mais nada além do serializador JSON.


--
[],
AC

Lucas Cavalcanti

unread,
Jul 7, 2011, 4:42:38 PM7/7/11
to caelum-vr...@googlegroups.com
entendi...

sabe criar a branch a partir da tag?
não se esqueça de criar o fork e depois pushar a sua branch pro fork, pra gente dar uns pitacos ;)

[]'s

2011/7/7 Antonio Carlos da Graça Mota Durão de Souza <ac.de...@gmail.com>


--
[],
AC

--

Guilherme Silveira

unread,
Jul 7, 2011, 4:43:04 PM7/7/11
to caelum-vr...@googlegroups.com
Oi Antonio,

Você quer uma versão identica ao 3.3.1 pois não pode atualizá-la,
isso? Mas com suporte a links no json, correto?
Se é isso, manda bala do commit point do 3.3.1, brancheia com um nome
do tipo 3.3.1-json. Podemos deployar uma versão assim para você e
depois mergear no master que sairia com a versão seguinte (3.3.2 se
for o caso).

Abraço

Guilherme Silveira
Caelum | Ensino e Inovação
http://www.caelum.com.br/

2011/7/7 Antonio Carlos da Graça Mota Durão de Souza <ac.de...@gmail.com>:

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 7, 2011, 4:48:37 PM7/7/11
to caelum-vr...@googlegroups.com
2011/7/7 Lucas Cavalcanti <lucasm...@gmail.com>
entendi...

sabe criar a branch a partir da tag?

git checkout vraptor-3.3.1
git checkout vraptor-3.3.1-json-serializer

Isso?
 
não se esqueça de criar o fork e depois pushar a sua branch pro fork, pra gente dar uns pitacos ;)

Blz.


--
[],
AC

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 7, 2011, 4:50:32 PM7/7/11
to caelum-vr...@googlegroups.com
2011/7/7 Guilherme Silveira <guilherme...@caelum.com.br>
Você quer uma versão identica ao 3.3.1 pois não pode atualizá-la,
isso? Mas com suporte a links no json, correto?

Isso! Perfeito! Exatamente isso. 

Se é isso, manda bala do commit point do 3.3.1, brancheia com um nome
do tipo 3.3.1-json. Podemos deployar uma versão assim para você e
depois mergear no master que sairia com a versão seguinte (3.3.2 se
for o caso).

Valeu. Queria ter certeza de que essa funcionalidade não entraria em conflito com nenhuma que esteja em desenvolvimento para a próxima versão.
 
Abraço

Guilherme Silveira
Caelum | Ensino e Inovação
http://www.caelum.com.br/


@Lucas, @Guilherme

Abraços e mais uma vez obrigado


--
[],
AC

Lucas Cavalcanti

unread,
Jul 7, 2011, 4:53:04 PM7/7/11
to caelum-vr...@googlegroups.com
isso funciona sim (colocando um -b)...

short:

git checkout -b vraptor-3.3.1-json-serializer  vraptor-3.3.1

2011/7/7 Antonio Carlos da Graça Mota Durão de Souza <ac.de...@gmail.com>
2011/7/7 Guilherme Silveira <guilherme...@caelum.com.br>
[],
AC

--

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 7, 2011, 4:55:07 PM7/7/11
to caelum-vr...@googlegroups.com
2011/7/7 Lucas Cavalcanti <lucasm...@gmail.com>
isso funciona sim (colocando um -b)...

short:

git checkout -b vraptor-3.3.1-json-serializer  vraptor-3.3.1

Isso! O animalzinho aqui, esqueceu de mandar o -b. Mauz aê :)


--
[],
AC

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 10, 2011, 11:13:37 PM7/10/11
to caelum-vr...@googlegroups.com
Lucas/Guilherme,

Este fim de semana subi alguma coisa da implementação. Poderia dar uma olhada?

Antes de um Pull Request, prefiro um RFC. Mas, se preferir, peço o Pull.


O que eu fiz:
  • Criei um Converter JSON, do XStream, para ser usado pelo RestfulSerializationJSON. Este converter cria os links a partir das Relations.
  • Testes para garantir que o JSON estava do jeito que eu quero.
  • Testes para garantir que o RestfulSerializationJSON está usando o converter que eu criei.

O que pode ser melhorado:
  • As classes que criei, são basicamente cópias das usadas para XML. Não tentei juntar as duas em uma hierarquia ou extrair os comportamentos comuns para outra classe.
  • Tive dificuldade de usar o writer do XStream para gerar os links como eu queria, então criei uma classe Link, com escopo de pacote, que representa os links propriamente ditos, com os atributos rel e href. Aceito dicas :)
  • Ele está criando assim:
links: [
    {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Mas, talvez, devesse estar criando assim:
links: [
    link: {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Não tenho uma opinião formada sobre qual das formas está certa. Assumindo a segunda, preciso de ajuda/guia para a questão de colocar o nome da classe no início.


Acho que é isso.

-- 
Muito obrigado pela atenção e ajuda que vocês me deram/darão,
AC

Lucas Cavalcanti

unread,
Jul 11, 2011, 12:11:47 PM7/11/11
to caelum-vr...@googlegroups.com
Olá,

  • As classes que criei, são basicamente cópias das usadas para XML. Não tentei juntar as duas em uma hierarquia ou extrair os comportamentos comuns para outra classe.
Não rola usar uma composição? 
  • Tive dificuldade de usar o writer do XStream para gerar os links como eu queria, então criei uma classe Link, com escopo de pacote, que representa os links propriamente ditos, com os atributos rel e href. Aceito dicas :)
o VRaptor já tem uma classe Link pra representar os links, não deu pra usar ele?
 
  • Ele está criando assim:
links: [
    {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Mas, talvez, devesse estar criando assim:
links: [
    link: {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Não tenho uma opinião formada sobre qual das formas está certa. Assumindo a segunda, preciso de ajuda/guia para a questão de colocar o nome da classe no início.
precisa ver como o pessoal do REST tá fazendo isso. Guilherme?
 


Acho que é isso.

-- 
Muito obrigado pela atenção e ajuda que vocês me deram/darão,
AC

--

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 11, 2011, 12:46:53 PM7/11/11
to caelum-vr...@googlegroups.com
Lucas,

Minhas dúvidas

2011/7/11 Lucas Cavalcanti <lucasm...@gmail.com>

Olá,

  • As classes que criei, são basicamente cópias das usadas para XML. Não tentei juntar as duas em uma hierarquia ou extrair os comportamentos comuns para outra classe.
Não rola usar uma composição? 

Achei melhor não juntar os dois conceitos, agora. Assim diminuem as chances de adicionar um bug ou regressão inesperado.
 
  • Tive dificuldade de usar o writer do XStream para gerar os links como eu queria, então criei uma classe Link, com escopo de pacote, que representa os links propriamente ditos, com os atributos rel e href. Aceito dicas :)
o VRaptor já tem uma classe Link pra representar os links, não deu pra usar ele?

Qual classe? No conversor para XML(LinkConverter) ele faz campo a campo. Sem usar uma classe para isso.
 
  • Ele está criando assim:
links: [
    {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Mas, talvez, devesse estar criando assim:
links: [
    link: {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Não tenho uma opinião formada sobre qual das formas está certa. Assumindo a segunda, preciso de ajuda/guia para a questão de colocar o nome da classe no início.
precisa ver como o pessoal do REST tá fazendo isso. Guilherme?

Olhando os testes de serialização, que já existem, reparo que existe uma tendência para a primeira versão. Que foi a que implementei. Um vez que não tem um atributo link, mas um objeto.


--
[],
AC

Rafael de F. Ferreira

unread,
Jul 11, 2011, 12:48:36 PM7/11/11
to caelum-vr...@googlegroups.com
Eu acho que as discussões sobre padronizar hypermedia em JSON estão
meio pela metade ainda. Sigam os links aqui:

http://microformats.org/wiki/rest/json

--
Rafael de F. Ferreira.
http://www.rafaelferreira.net/

2011/7/11 Lucas Cavalcanti <lucasm...@gmail.com>:

Lucas Cavalcanti

unread,
Jul 11, 2011, 12:57:22 PM7/11/11
to caelum-vr...@googlegroups.com

Qual classe? No conversor para XML(LinkConverter) ele faz campo a campo. Sem usar uma classe para isso.
ele converte na mão uma classe chamada Relation.
Talvez se vc fizer um converter pra ela já resolve. 
 
  • Ele está criando assim:
links: [
    {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Mas, talvez, devesse estar criando assim:
links: [
    link: {
        "rel": "kill",
        "href": "http://www.caelum.com/kill"
    }
]

Não tenho uma opinião formada sobre qual das formas está certa. Assumindo a segunda, preciso de ajuda/guia para a questão de colocar o nome da classe no início.
precisa ver como o pessoal do REST tá fazendo isso. Guilherme?

Olhando os testes de serialização, que já existem, reparo que existe uma tendência para a primeira versão. Que foi a que implementei. Um vez que não tem um atributo link, mas um objeto.


--
[],
AC

--

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 11, 2011, 1:18:38 PM7/11/11
to caelum-vr...@googlegroups.com
2011/7/11 Lucas Cavalcanti <lucasm...@gmail.com>

Qual classe? No conversor para XML(LinkConverter) ele faz campo a campo. Sem usar uma classe para isso.
ele converte na mão uma classe chamada Relation.
Talvez se vc fizer um converter pra ela já resolve. 

Mas foi isso que eu fiz: LinkConverterJSON, só que eu criei uma classe Link, com escopo de pacote.
Ao invés de fazer:

writer.startNode("link");
writer.addAttribute("rel");
writer.addAttribute("href");
writer.endNode();

Que está gerando:
links: [
    {
        "@rel": "kill"
        "@href": "http://www.caelum.com/kill"
    }
]


Eu fiz:
link = new Link(t.getName(), config.getApplicationPath() + t.getUri());
ExtendedHierarchicalStreamWriterHelper.startNode(writer, "link", String.class);
context.convertAnother(link);
writer.endNode();

Para poder gerar assim:
links: [
    {
        "rel": "kill"
        "href": "http://www.caelum.com/kill"
    }
]


--
[],
AC

Lucas Cavalcanti

unread,
Jul 11, 2011, 1:40:08 PM7/11/11
to caelum-vr...@googlegroups.com
justo =)

2011/7/11 Antonio Carlos da Graça Mota Durão de Souza <ac.de...@gmail.com>

--
[],
AC

--

Antonio Carlos da Graça Mota Durão de Souza

unread,
Jul 11, 2011, 1:41:59 PM7/11/11
to caelum-vr...@googlegroups.com
Vou fazer o pull-request, blz?


--
[],
AC

Lucas Cavalcanti

unread,
Jul 11, 2011, 1:44:03 PM7/11/11
to caelum-vr...@googlegroups.com
por favor =)

2011/7/11 Antonio Carlos da Graça Mota Durão de Souza <ac.de...@gmail.com>
Vou fazer o pull-request, blz?


--
[],
AC

--

AC de Souza

unread,
Jul 11, 2011, 5:43:43 PM7/11/11
to caelum-vraptor-dev
Reply all
Reply to author
Forward
0 new messages