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;"
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
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")
@Post
public void receberMultas(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
@Post
public void receberMultas(String multas){...}
//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…
Entendi, o json completo é a serialização de uma classe Carro que contém Multas.
[code]public class Carro{
public String nome;
public String modelo;
public String placa;
public List<String> multas;
gets/sets
}
[/code]
Criei então uma classe de multa
public class Multa { public String valor; ... }
// alterei a Classe de carro pra tratar a lista de objetos Multa agora
public class Carro{ public List<Multa> multas; ... }
De qq forma gera uma exception acusando duplicação de campo… vou investigar mais isso, mas pelo jeito é o caminho mais certo
SEVERE: Unhandled exception occurred whilst decorating page
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: multas
---- Debugging information ----
duplicate-field : multas
class : fiat.model.entity.Veiculo
required-type : fiat.model.entity.Veiculo
line number : -1
-------------------------------
EXCEPTION
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: multas
---- Debugging information ----
duplicate-field : multas
class : fiat.model.entity.Veiculo
required-type : fiat.model.entity.Veiculo
line number : -1
-------------------------------[/code]
Lista tipo objeto
[code]dados = ‘{“veiculo”:{“nome”:“Palio”,“placa”:“PAL - 00000”,“multas”:[{“valor”:“R$20”},{“valor”: “R$30”}]}}’ ;
+
ArrayList<Multa> multas; // Class Multa{ public String valor; …gets/sets… }
EXCEPTION
com.thoughtworks.xstream.converters.ConversionException: valor : valor : valor : valor
---- Debugging information ----
message : valor : valor
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : valor : valor
class : fiat.model.entity.Veiculo
required-type : java.util.ArrayList
line number : -1
-------------------------------[/code]
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).
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
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?