Valeu Lucas, era isso mesmo que eu queria, funcionou blz.
donny
Buenas! Estava com o mesmo problema! Show de bola o VRaptor!!!
pgnt
Estou com problema semelhante para receber dados de uma requisição Ajax usando json…
Poderiam, por favor, colocar o código Controller q fizeram pra receber os dados?
Controller anotado com @post / @Consumes("application/json").
O jQuery/Ajax informando no envio type: "post", dataType: "json",contentType: "application/json;"
Obrigado!
pgnt
Problema no JSON.stringify que não tava convertendo o objeto (só os atributos), arrumei na mão e rolou no lado do servidor, o problema tá na view mesmo
abs
pgnt
Agora está dando problema para enviar lista do Json (via Ajax), não estou conseguindo receber array.
Estou fazendo na mão simplificando (esse dado é um list de um objeto - “carro.multas”).
No client (javascript)
dados = '{"multas":["R$20","R$30","R$40","R$50","R$60","R$70"]}' ;
No servidor (vraptor 3)
@Consumes("application/json")@PostpublicvoidreceberMultas(ArrayList<String>multas){...}// gera exception: br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=multas, type=class java.util.ArrayList)
Vi alguma a opção de trabalhar com Gson, baixei mas não consigo receber nem em formato de string o parâmetro
@Consumes("application/json")// sem @Consumes e tirando contentType: "application/json; do client nada muda@PostpublicvoidreceberMultas(Stringmultas){...}//não gera exception mas tb não recebo o string
formatando num estado bem simples (não em forma de lista), consigo receber o parâmetro…
dados = '{"multas":"R$20"}' ;
Alguma luz?
abs
Lucas_Cavalcanti
não vai funcionar com uma lista… vc precisa criar um VO pra encapsular a lista:
classMultas {
List<String>multas;
}
e receber esse cara no método. É uma limitação do deserializer de json que a gente usa no vraptor (XStream)
pgnt
Entendi, o json completo é a serialização de uma classe Carro que contém Multas.
public class Carro{
public String nome;
public String modelo;
public String placa;
public List<String> multas;
gets/sets
}
Criei então uma classe de multa
publicclassMulta{publicStringvalor;...}// alterei a Classe de carro pra tratar a lista de objetos Multa agorapublicclassCarro{publicList<Multa>multas;...}
De qq forma gera uma exception acusando duplicação de campo... vou investigar mais isso, mas pelo jeito é o caminho mais certo
dados='{"veiculo":{"nome":"Palio","placa":"PAL - 00000","multas":[{"valor":"R$20"},{"valor":"R$30"}]}}';+ArrayList<Multa>multas;// Class Multa{ public String valor; ...gets/sets.. }=EXCEPTIONcom.thoughtworks.xstream.converters.ConversionException:valor:valor:valor:valor----Debugginginformation----message:valor:valorcause-exception:com.thoughtworks.xstream.mapper.CannotResolveClassExceptioncause-message:valor:valorclass:fiat.model.entity.Veiculorequired-type:java.util.ArrayListlinenumber:-1-------------------------------
Pensei em receber formato JSON como texto (sem anotar o [color=darkred]@Consumes("application/json")[/color]) para o método e tentar deserializar com Gson, mas o post é barrado por causa dos caracteres especiais (um texto simples vai).
abs
Lucas_Cavalcanti
troca de ArrayList pra só List
pgnt
Estava assim, depois q implementei a classe concreta, mas não mudou…
Lucas_Cavalcanti
vc pode desistir de mandar json e mandar form parameters mesmo… vai funcionar tranquilo com o VRaptor
algum motivo forte pra ter usado json e não form parameters?
pgnt
Blz, pra resolver este problema especificamente não é necessário mesmo.
Mas estou procurando ter isso resolvido pra não precisar sair desesperado atrás da solução (qdo, por ex, precisar consumir um webservice em JSON).
Encontrei gente reclamando de desearilizar listas em XML tb, então imagina…
Comecei a ler mais sobre Xstream e Jettison (o problema pode ser o Jettison).
Ainda não achei a solução, mas estou vendo algumas pistas do q pode ser o problema,
ex: "Jettison for serialization and deserialization support with JSON. Note, that newer versions 1.3.x are no longer compatible with XStream." http://xstream.codehaus.org/download.html
Valeu man a força ae, se conseguir alguma coisa volto com a solução.
abs
Lucas_Cavalcanti
xml costuma funcionar melhor, pq tudo tem raiz… mas listas em geral costumam zoar as deserializações, mesmo…
pgnt
Outra coisa q tava pensando, era a possibilidade reescrever a referência da injeção de dependência no Controller deixando o Gson como padrão no lugar do XStream (não conheço Gson, mas vi nos posts q é melhor pra deserializar).
Dá pra fazer isso no VRaptor ou algo parecido?
Será q consideram lançar uma próxima versão mudando a ferramenta de deserialização?
abs
Lucas_Cavalcanti
Dá pra fazer sim, só criar uma classe que implementa Deserializer (do VRaptor), anotada com @Deserializes(“application/json”)
o vraptor já vai usar a sua classe automaticamente.
Se quiser tentar implementar e colocar no VRaptor, pull requests são muito bem vindos =)
pgnt
Blz, vou ver as opções qdo tiver tempo, valeu a força!!!
abs