[RESOLVIDO] Dúvidas VRaptor3 x JSON  XML
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Autor Mensagem
smillodont
Entusiasta Java
[Avatar]

Membro desde: 02/03/2010 20:32:22
Mensagens: 16
Localização: Belo Horizonte, Minas Gerais, Brasil
Offline

Olá pessoal,

conforme falado em uma outra dúvida que acabei de postar, estou iniciando com o VRaptor3 e estou com algumas dúvidas. No caso, sobre JSON. Seguem algumas perguntas, se alguém puder me ajudar, ficarei muito grato:

PERGUNTA 1: como gerar um JSON com apenas um elemento de tipo primitivo?

Exemplo: quero gerar um JSON com um valor boolean com o nome "success". Se eu fizer:



eu obtenho



ao invés de




PERGUNTA 2: como gerar um JSON com vários objetos utilizando a serialização oferecida pelo VRaptor (e não manualmente via 'metodo.json.jsp') ?

Exemplo: quero gerar um JSON com um objeto Cliente e com um objeto Empresa. Se eu fizer:



eu obtenho



ao invés de



PERGUNTA 3: considerando o método manual de gerar JSON, sei que podemos passar o parâmetro _format=json na requisição, colocar o nosso template de JSON no caminho /WEB-INF/jsp/[recurso]/[metodo].json.jsp e setar os dados no JSON via método result.include. Existe alguma outra forma de se fazer isso? No guia do VRaptor encontrei uma outra forma através de alteração do "Header Accepts da requisição", mas não entendo como seria isso. Alguém poderia me mostrar um exemplo?


PERGUNTA 4: lendo sobre o VRaptor percebi que esse oferece suporte à serialização de objetos compostos, mas de forma explícita, via método include. Contudo, no VRaptor2, me lembro de uma anotação @Remotable que fazia com que essa serialização composta fosse implícita. Existe algo parecido assim no VRaptor3, como por exemplo alguma alteração na configuração padrão do VRaptor de modo que algo do tipo



serializasse implicitamente todos os campos de cliente? Na documentação vi falando algo sobre XStream e não sei se isso poderia ajudar nesse ponto. Se sim, alguém poderia me fornecer um exemplo?

Muito obrigado e peço desculpas pelas diversas perguntas, mas fiquei um tempo sem internet e as dúvidas acumularam-se.


Obrigado.


This message was edited 1 time. Last update was at 07/03/2010 15:58:26

[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

smillodont wrote:
PERGUNTA 1: como gerar um JSON com apenas um elemento de tipo primitivo?

Exemplo: quero gerar um JSON com um valor boolean com o nome "success". Se eu fizer:



Tenta criar uma classe, pode ser interna:

O VRaptor usa o XStream pra gerar o json, e ele não suporta dar nomes pra primitivos diretamente...

smillodont wrote:
PERGUNTA 2: como gerar um JSON com vários objetos utilizando a serialização oferecida pelo VRaptor (e não manualmente via 'metodo.json.jsp') ?

Exemplo: quero gerar um JSON com um objeto Cliente e com um objeto Empresa. Se eu fizer:



Mesma coisa, crie uma classe interna:


smillodont wrote:
PERGUNTA 3: considerando o método manual de gerar JSON, sei que podemos passar o parâmetro _format=json na requisição, colocar o nosso template de JSON no caminho /WEB-INF/jsp/[recurso]/[metodo].json.jsp e setar os dados no JSON via método result.include. Existe alguma outra forma de se fazer isso? No guia do VRaptor encontrei uma outra forma através de alteração do "Header Accepts da requisição", mas não entendo como seria isso. Alguém poderia me mostrar um exemplo?

Se vc não quer usar o _format, vc precisa usar o Header Accept... no browser, vc precisa usar javascript pra fazer isso, com um XMLHttpRequest, ou algo do tipo...
não tenho certeza se o <form accept="json"....> funcionaria...

smillodont wrote:
PERGUNTA 4: lendo sobre o VRaptor percebi que esse oferece suporte à serialização de objetos compostos, mas de forma explícita, via método include. Contudo, no VRaptor2, me lembro de uma anotação @Remotable que fazia com que essa serialização composta fosse implícita. Existe algo parecido assim no VRaptor3, como por exemplo alguma alteração na configuração padrão do VRaptor de modo que algo do tipo



serializasse implicitamente todos os campos de cliente? Na documentação vi falando algo sobre XStream e não sei se isso poderia ajudar nesse ponto. Se sim, alguém poderia me fornecer um exemplo?

Não dá pra fazer implicitamente... pq não dá pra saber qdo parar... imagine que um Cliente tem um campo Usuário, que tem um campo cliente, etc... ia ficar em loop infinito! imagine tb que o cliente tem uma lista de produtos comprados... podem ser milhares de produtos, e esses produtos terem relacionamento com estoque e coisas do tipo... enfim... serializar tudo não é uma boa... vc tem que mandar pra view só aquilo que é relevante pra mostrar na tela

--
Caelum
www.caelum.com.br

smillodont
Entusiasta Java
[Avatar]

Membro desde: 02/03/2010 20:32:22
Mensagens: 16
Localização: Belo Horizonte, Minas Gerais, Brasil
Offline

Olá Lucas, muito obrigado pelas respostas. Complementando as perguntas:

Quanto à PERGUNTA 1, entendi a resposta, contudo, com a solução proposta, o JSON gerado será algo do tipo:



Existe alguma forma de omitir o nome do campo pai, via algo parecido com result.use(json()).from(new Success(true)).serialize(), de forma a obter o JSON:



Isso seria importante pois estou utilizando ExtJS e esse é o formato esperado de resposta em uma submissão de formulário.

Quanto à PERGUNTA 2, você deu como resposta:



só para confirmar, na verdade, o correto seria o que segue abaixo, certo?



Quanto à PERGUNTA 4, entendi sua explicação sobre impossibilidade, mas não concordo. Entendo da necessidade de haver uma forma do usuário explicitamente incluir e excluir campos. Concordo que existem situações onde isso é muito importante. Contudo, se os objetos que o usuário gere a serem serializados devam (ou possam) ter todos os seus campos serializados (independentes desses serem primitivos ou não-primitivos), então seria bastante interessante que essa serialização recursiva e implícita fosse possível. Porque, assim, se esse objeto for alterado (adicionado um campo não-primitivo, por exemplo), o usuário não teria que se preocupar com a serialização: os dados chegariam todos no cliente e a preocupação seria restrita a alterações na view (JSP, JS, etc). O que acha ?

Muito obrigado mais uma vez.

This message was edited 1 time. Last update was at 03/03/2010 22:56:33

[MSN]
jingle
Virtual Machine Man

Membro desde: 04/10/2006 20:40:08
Mensagens: 642
Localização: Canoas/RS
Offline

Oi tenho uma duvida também em relação ao Vraptor + json.. vou me aproveita do tópico posso?

Como uso validator e Json? quero passar as mensagem que derram de erro via JSON.

tentei com onErroUse + Results.json, mas não sei em que objeto dar from pra obter as mensagens, e se passo uma string qualuer pra testar e mando serializar, da nullpointer quando não tiver erro no validator.

exemplo:
[Email] [MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

smillodont wrote:Olá Lucas, muito obrigado pelas respostas. Complementando as perguntas:

Quanto à PERGUNTA 1, entendi a resposta, contudo, com a solução proposta, o JSON gerado será algo do tipo:



Existe alguma forma de omitir o nome do campo pai, via algo parecido com result.use(json()).from(new Success(true)).serialize(), de forma a obter o JSON:



Isso seria importante pois estou utilizando ExtJS e esse é o formato esperado de resposta em uma submissão de formulário.


Crie essa classe:


smillodont wrote:
Quanto à PERGUNTA 2, você deu como resposta:



só para confirmar, na verdade, o correto seria o que segue abaixo, certo?



Isso mesmo, erro meu =)

smillodont wrote:
Quanto à PERGUNTA 4, entendi sua explicação sobre impossibilidade, mas não concordo. Entendo da necessidade de haver uma forma do usuário explicitamente incluir e excluir campos. Concordo que existem situações onde isso é muito importante. Contudo, se os objetos que o usuário gere a serem serializados devam (ou possam) ter todos os seus campos serializados (independentes desses serem primitivos ou não-primitivos), então seria bastante interessante que essa serialização recursiva e implícita fosse possível. Porque, assim, se esse objeto for alterado (adicionado um campo não-primitivo, por exemplo), o usuário não teria que se preocupar com a serialização: os dados chegariam todos no cliente e a preocupação seria restrita a alterações na view (JSP, JS, etc). O que acha ?

Muito obrigado mais uma vez.

Acho que não tem problema fazer isso... crie uma issue lá no github, se possível em inglês, que a gente implementa =)
http://github.com/caelum/vraptor/issues

Abraço

--
Caelum
www.caelum.com.br

Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

jingle wrote:Oi tenho uma duvida também em relação ao Vraptor + json.. vou me aproveita do tópico posso?

Como uso validator e Json? quero passar as mensagem que derram de erro via JSON.

tentei com onErroUse + Results.json, mas não sei em que objeto dar from pra obter as mensagens, e se passo uma string qualuer pra testar e mando serializar, da nullpointer quando não tiver erro no validator.

exemplo:

isso é um bug do vraptor =( vou corrigir assim q possível e te mando um snapshot...

--
Caelum
www.caelum.com.br

smillodont
Entusiasta Java
[Avatar]

Membro desde: 02/03/2010 20:32:22
Mensagens: 16
Localização: Belo Horizonte, Minas Gerais, Brasil
Offline

Olá Lucas, muito obrigado mais uma vez. Mas ainda ficou uma dúvida:

Quanto à PERGUNTA 2, você falou para implementar a classe CustomJSONSerialization. A implementei exatamente como você escreveu e abaixo segue o resultado final:




Mas a classe não compila, apresentando o seguinte erro:

cannot find symbol
symbol : constructor XStreamJSONSerialization()
location: class br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization
public class CustomJSONSerialization extends XStreamJSONSerialization {


Além disso, não entendi como seria o uso dessa classe. Se puder ajudar mais uma vez. Obrigado.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

aquele comentário //delegate constructor era pra vc gerar o construtor..

se vc estiver usando o eclipse é só dar Ctrl+1 em cima do erro... de qqer forma o construtor seria:



e vc não precisa usar essa classe... o VRaptor que vai fazer isso

This message was edited 1 time. Last update was at 04/03/2010 22:40:42


--
Caelum
www.caelum.com.br

smillodont
Entusiasta Java
[Avatar]

Membro desde: 02/03/2010 20:32:22
Mensagens: 16
Localização: Belo Horizonte, Minas Gerais, Brasil
Offline

Funcionou blz! Chick d+. Agora eu acho que dou esse post como resolvido, salvo a última pergunta: a solução que você propôs faz com que todo uso do tipo



omita o nome da raiz ('campo', no caso do código acima). Contudo, se em outro momento eu precisar desse nome do campo raiz, não vou ter essa informação. Ou seja, ou eu sempre tenho a raiz em todos os JSONs gerados como acima (caso default do VRaptor3) ou nunca tenho a raiz (caso onde se faz uso do CustomJSONSerialization citado), certo? Ou tem um meio do caminho (parametrizável, por exemplo) que eu não percebi?

Obrigado.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

não tem um meio caminho... pelo menos não "nativamente" no código do vraptor...

mas dá pra implementar classes parecidas como a CustomJSONSerialization e fazer isso:


--
Caelum
www.caelum.com.br

smillodont
Entusiasta Java
[Avatar]

Membro desde: 02/03/2010 20:32:22
Mensagens: 16
Localização: Belo Horizonte, Minas Gerais, Brasil
Offline

Testei aqui, funcionou blz. Muito bom isso. Mas aí apareceu outra pergunta: se eu tenho várias classes parecidas com a CustomJSONSerialization, quando eu utilizar algo como



qual das classes CustomJSONSerialization será utilizada?

vlw
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

vai dar uma exception falando q tem mtas classes... mas vc pode criar uma classe que tem métodos estaticos, pra vc fazer import:


--
Caelum
www.caelum.com.br

Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

Lucas Cavalcanti wrote:
jingle wrote:Oi tenho uma duvida também em relação ao Vraptor + json.. vou me aproveita do tópico posso?

Como uso validator e Json? quero passar as mensagem que derram de erro via JSON.

tentei com onErroUse + Results.json, mas não sei em que objeto dar from pra obter as mensagens, e se passo uma string qualuer pra testar e mando serializar, da nullpointer quando não tiver erro no validator.

exemplo:

isso é um bug do vraptor =( vou corrigir assim q possível e te mando um snapshot...

Bug corrigido... snapshot:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.2-SNAPSHOT/vraptor-3.1.2-20100305.215218-3.jar

--
Caelum
www.caelum.com.br

jingle
Virtual Machine Man

Membro desde: 04/10/2006 20:40:08
Mensagens: 642
Localização: Canoas/RS
Offline

Lucas Cavalcanti wrote:
Lucas Cavalcanti wrote:
jingle wrote:Oi tenho uma duvida também em relação ao Vraptor + json.. vou me aproveita do tópico posso?

Como uso validator e Json? quero passar as mensagem que derram de erro via JSON.

tentei com onErroUse + Results.json, mas não sei em que objeto dar from pra obter as mensagens, e se passo uma string qualuer pra testar e mando serializar, da nullpointer quando não tiver erro no validator.

exemplo:

isso é um bug do vraptor =( vou corrigir assim q possível e te mando um snapshot...

Bug corrigido... snapshot:
http://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.1.2-SNAPSHOT/vraptor-3.1.2-20100305.215218-3.jar


Valeuu!!

agora como faço pra pegar as mensagens de erro no validator? pra mim poder manda pra tela?
[Email] [MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 5631
Offline

http://vraptor.caelum.com.br/documentacao/validacao/

se vc usou tudo direitinho, o próprio vraptor coloca uma variável ${errors} na jsp que tem os erros

--
Caelum
www.caelum.com.br

 
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Ir para:   
Powered by JForum 2.1.8 © JForum Team