| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/08/2011 10:44:28
|
acdesouza
JavaChild
![[Avatar]](/images/avatar/d4535535b455dd9b910ba56286a4d8f5.jpg)
Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline
|
Caros,
Estou tentando usar o vraptor-gson-plugin, para serializar os JSONs usando a API Gson, do Google.
O problema é que a escolha, por parte do VRaptor, de qual a implementação de br.com.caelum.vraptor.serialization.JSONSerialization não parece ser determinística. Ou seja, quando eu inicio a aplicação uma vez, ele usa o padrão do VRaptor, com XStream. Quando eu executo uma outra vez, usa o Gson.
Observe que, diferente do que a última frase posso insinuar, não é intercalado. É, como se o VRaptor estivesse jogando cara-ou-coroa entre as duas implementações e quem ganha é usado.
Para resolver o problema já tentei as seguintes abordagens:
1. Criar um br.com.caelum.vraptor.util.gson.GsonSerializationProvider, que herda de SpringProvider e colocar ele no web.xml:
Neste caso, imaginei que ao ativar o restfulie, o pacote de serialização padrão ganhava prioridade.
2. Colocar o pacote onde estão os serializadores no web.xml
Aqui não imagino uma explicação.
Imaginei que deveria rolar uma forma de "desregistrar", no VRaptor, o serializador padrão de JSON. Mas, não achei como.
Alguém teria uma idéia?
|
[],
AC |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/08/2011 14:54:33
|
acdesouza
JavaChild
![[Avatar]](/images/avatar/d4535535b455dd9b910ba56286a4d8f5.jpg)
Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline
|
O lance é o seguinte:
O VRaptor recupera os Serializers e os coloca em uma lista.
Para evitar o problema que eu relatei, ele ordena esta lista colocando os Serializers, que começam com o pacote br.com.caelum.vraptor.serialization no final.
Só que o pacote da minha classe é br.com.caelum.vraptor.serialization.gson, o que fazia com que ele colocasse como igual.
Então mudei o nome do pacote para br.com.contrib.vraptor.serialization, mas não resolveu.
Debugar o VRaptor me fez acreditar que o problema está na classe br.com.caelum.vraptor.serialization.DefaultRepresentationResult.
Ela recebe uma lista de Serialization e a ordena. O problema é exatamente esta ordenação. Dependendo da ordem inicial da lista, a lista ordenada é modificada.
Alguém poderia ajudar? Seguem os exemplos:
Caso em que dá erro ============
=======================================
Casos em que não dá erro ===========================
*********************************************************
============================================
|
[],
AC |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/08/2011 20:05:13
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
o que vc pode fazer é sobrescrever o componente RepresentationResult, ordenando do jeito que vc precisa...
só copiar a classe https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/DefaultRepresentationResult.java para o seu projeto, e ordenar do jeito que vc precisa...
mas como vc tá fazendo um plugin, o que a implementação padrão está fazendo é dando menos prioridade para serializers do pacote br.com.caelum.vraptor.serialization.
o que vc pode fazer é trocar o pacote do plugin pra outra coisa (tipo br.com.acdesouza.serialization), isso já vai resolver o problema.
vc não precisa do provider. Ao invés disso, anote as classes do plugin com @Component, e registre no packages o pacote base do plugin.
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 09:10:00
|
acdesouza
JavaChild
![[Avatar]](/images/avatar/d4535535b455dd9b910ba56286a4d8f5.jpg)
Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline
|
Beleza. Isso resolve no projeto atual.
Lucas Cavalcanti wrote:mas como vc tá fazendo um plugin, o que a implementação padrão está fazendo é dando menos prioridade para serializers do pacote br.com.caelum.vraptor.serialization.
Isso. É, exatamente, isso que deveria estar acontecendo. Mas, debugando a classe br.com.caelum.vraptor.serialization.DefaultRepresentationResult, observei que a ordenação não está funcionando.
Como eu disse, a ordenação não está sendo determinística, isto é, dependendo da ordem de entrada o resultado muda. Estou pensando em remover o PackageComparator da classe para testá-lo.
Lucas Cavalcanti wrote:o que vc pode fazer é trocar o pacote do plugin pra outra coisa (tipo br.com.acdesouza.serialization), isso já vai resolver o problema.
Imaginei que deveria resolver. Mas, não deu certo. O histórico do nome dos pacotes foi:
br.com.caelum.vraptor: descobri o problema;
br.com.contrib.vraptor: tentativa de resolver;
br.com.beyondclick.vraptor: segunda tentativa de resolver;
E, nos dois casos deu o problema.
Lucas Cavalcanti wrote:vc não precisa do provider. Ao invés disso, anote as classes do plugin com @Component, e registre no packages o pacote base do plugin.
Eu não estou usando. Foi um momento de desespero para ver se resolvia
|
[],
AC |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 09:43:36
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
alguma sugestão de como fazer a ordenação dos serializers?
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 13:08:38
|
acdesouza
JavaChild
![[Avatar]](/images/avatar/d4535535b455dd9b910ba56286a4d8f5.jpg)
Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline
|
Lucas Cavalcanti wrote:alguma sugestão de como fazer a ordenação dos serializers?
Extrai o Comparator para um arquivo, e fiz um teste para ele:
O primeiro passa, o segundo quebra. Estou analisando para corrigir.
|
[],
AC |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 13:31:09
|
acdesouza
JavaChild
![[Avatar]](/images/avatar/d4535535b455dd9b910ba56286a4d8f5.jpg)
Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline
|
Parece que achei
O lance é que o Comparator dá baixa prioridade para o pacote: br.com.caelum.vraptor.serialization
E, o JSON está em br.com.caelum.vraptor.restfulie.serialization.
Por isso que, dependendo da ordem, funciona. Porque o Serialization do plugin tem que estar na frente do Serialization do Restfulie.
Para resolver, sugiro colocar o pacote do restfulie como menos prioridade do que os 3rd parties, porém, mais prioridade do que o outros da caelum.
O que acha?
|
[],
AC |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 13:58:49
|
Lucas Cavalcanti
GUJ Hacker
![[Avatar]](/images/avatar/5f6780632f5d27dd0cded5fc9361169e.jpg)
Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline
|
parece bom =)
|
--
Caelum
www.caelum.com.br
 |
|
|
 |
|
|
|
|