| Autor |
Mensagem |
|
|
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?
|
 |
|
|
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.
|
 |
|
|
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
|
 |
|
|
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 ===========================
*********************************************************
============================================
|
 |
|
|
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?
|
 |
|
|
Lucas Cavalcanti wrote:pra usar os componentes do Restfulie server vc precisa colocar no web.xml (eles são opcionais):
Muuuuuuuuuuuito OBRIGADO!!!!!
|
 |
|
|
garcia-jj wrote:Você pode criar uma factory para esse compoente (Restfulie).
Não, não posso. O VRaptor quem cria ele.
garcia-jj wrote:Não conheço o Restfulie, então não sei se tem uma forma mais mágica de cria-lo. Talvez o Lucas saiba se tem outra forma melhor.
Isso O ponto é que eu não estou entendendo porque o VRaptor ainda não criou uma instância do Restfulie. Estou com esperança de que o Lucas me de uma força!
|
 |
|
|
Caros,
Estou fazendo um plugin para o VRaptor serializar JSON usando o Gson, da Google.
Eu conheci o vraptor-gson-serializer, mas ele obriga a usar uma anotação em cada resource, o que eu não gostei. Além disso, ele não serializa os HypermediaResources.
Meu problema é que o Spring não está conseguindo instanciar a classe que recebe o objeto Restfulie, por não encontrar nenhuma instância dele disonível.
A classe que não está conseguindo ser instanciada pelo Spring é a br.com.caelum.vraptor.restfulie.serialization.GsonRestfulSerializationJSON, e não estou conseguindo escrever um teste que demonstre o erro.
O erro, resumidamente, é:
Alguma luz?
O código está no github: https://github.com/acdesouza/vraptor-gson-plugin
|
 |
|
|
Só para linkar os assuntos: Discussão sobre serialização dos links com representação JSON, na lista de discussão dos desenvolvedores. Pull-request, no Github para a adição da funcionalidade.
|
 |
|
|
Lucas Cavalcanti wrote:o snapshot deve estar em vraptor-core/lib/[optional]/jersey
Isso! Mas não encontrei nos repos do Maven. Estou usando o Central, Java.net e Jboss.
|
 |
|
|
Lucas Cavalcanti wrote:... qqer coisa grita 
AAAAHHHHH Então, baixei o VRaptor do github, dei um checkout para a tag 3.3.1 e criei um branch a partir dessa tag com o nome vraptor-3.3.2 Até aí tudo bem, mas não estou conseguindo compilar o projeto usando o maven. Mesmo depois de executar o maven_fix.sh Falta a dependência do jersey-core/server. No pom.xml está dizendo que depende de uma versão 1(com o groupId errado), só que esta não existe. No ant está sendo usado uma versão 1.5-SNAPSHOT, só que não acho o snapshot usado. Tem alguma coisa que estou esquecendo de fazer? Esqueci de falar, mudei o groupId para com.sun.jersey e a versão para 1.5-SNAPSHOT, como diz no pom.xml dentro do jar que o ant usa. Outra coisa: Continuo a conversa por aqui mesmo ou mando para a lista vraptor-dev?
|
 |
|
|
Sim. #comofaz?
Estou vendo a implementação das classes do pacote: br.com.caelum.vraptor.restfulie.serialization
Acredito que saberia criar um parse, mas não sei como fazer ele ser utilizado. Por onde começo?
|
 |
|
|
Mas o RestfulSerialization é só para o XStreamXMLSerialization, certo? Estava precisando para o JSON. Não encontrei uma implementação de serializador para JSON. Devo implementar um? A idéia é ter um JSON assim:
|
 |
|
|
Não reparei se dava erro. Estou olhando a implementação dos serializadores e não estou entendendo onde ele faz o parse dos links. Olhando a classe DefaultRepresentationResult, vi que ela só executa os serializadores. E, a XStreamXMLSerialization seriaiza para XML. Certo? Então, nesta segunda, não entendi onde ele faz a criação dos links. Poderia me ajudar?
|
 |
|
|
Vamos lá....
1.
2.
3. Fiz um outro teste passando o header 'Accept: application/json'
Resumindo: Nem o recursive, nem a representação em JSON, estão tratando os relations da classe root.
|
 |
|
|
|
|