Prioridade de uso dos Serializers, disponíveis, no VRaptor.  XML
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Autor Mensagem
acdesouza
JavaChild
[Avatar]

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
[WWW]
acdesouza
JavaChild
[Avatar]

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
[WWW]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

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

acdesouza
JavaChild
[Avatar]

Membro desde: 20/08/2007 02:57:52
Mensagens: 110
Localização: Rio de Janeiro
Offline

Lucas Cavalcanti wrote: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...


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
    [WWW]
    Lucas Cavalcanti
    GUJ Hacker
    [Avatar]

    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

    acdesouza
    JavaChild
    [Avatar]

    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
    [WWW]
    acdesouza
    JavaChild
    [Avatar]

    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
    [WWW]
    Lucas Cavalcanti
    GUJ Hacker
    [Avatar]

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

    parece bom =)

    --
    Caelum
    www.caelum.com.br

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