Certo. Modifiquei o meu código $.ajax para o seguinte:
var data = {
cmd : 'save-record',
name : 'form',
recid : 10,
record : {
field1 : 'value1',
fieldN : 'valueN'
}
};
$.ajax({
type: "POST",
url: "system/saveRecord",
data: JSON.stringify(data),
contentType:'application/json',
success: function(json) {console.log('Concluído: ' + json)},
dataType: "json"
});
E me parece que agora está correto, pois inclusive o @Consumes não retorna erro 415.
A minha dúvida está em como receber isto no Controller, pois Map tenho o retorno de que a classe é abstrata e não pode ser instanciada. HashMap diz que não os nomes de parametros. String o resultado é nulo.
Tem alguma dica sobre como receber este objeto JSON no controller?
Eu preciso receber via JSON pois eu não conheço a estrutura de dados que irá chegar ao servidor, quero dizer, eu não posso colocar os parametros nome a nome, pois eu não sei quais são estes nomes.
Ou vc está dizendo para montar o JSON com “request.<NOME DO CAMPO” e ter um parametro de nome request no Controller?
Grato.
no caso de usar o @Consumes, vc talvez precisaria escrever um converter pra Map.
Crie uma classe que estende JsonDeserializer e anote-a com @Component.
e veja se passa por ela…
se quiser tentar fazer a implementação, eu posso te ajudar.
[quote=Lucas Cavalcanti]no caso de usar o @Consumes, vc talvez precisaria escrever um converter pra Map.
Crie uma classe que estende JsonDeserializer e anote-a com @Component.
e veja se passa por ela…
se quiser tentar fazer a implementação, eu posso te ajudar.[/quote]
Ok, vou dar início. Aviso em breve o resultado.
Depois que vc deu a dica para estender JsonDeserializer, eu fiz alguns testes com a classe GsonDeserialization, já que a primeira deu algum erro por conta do jettison… enfim.
Eu consegui observar que o meu JSON completinho está chegando ao parametro do método.
Agora me diga uma coisa: o q eu faço com este parametro? Já que a “deserialização” é realizada quando ele recebe o valor.
Como posso dar continuidade ao meu trabalho apenas com este parametro? É possível?
grato.
O json chega como string ou como JsonObject?
Agora que perguntou, troquei o parametro para JsonObject ao invés de GsonDeserialization e estou conseguindo receber a estrutura completa do JSON.
Agora vou dar uma estudada sobre o JsonObject e tentar recuperar meus dados “genéricos” a partir dele.
Obrigado.
Fechando o asunto…
Consegui receber a informação que precisava via parametro.
Resumidamente:
em web.xml habilitei os pacotes de deserialização via GSON conforme segue:
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.caelum.vraptor.deserialization.gson,
br.com.caelum.vraptor.serialization.gson</param-value>
</context-param>
No método do controller, anotado com @Consumes recebo um parametro JsonObject e percorro seu conteúdo “mapeando” as informações de acordo com o que vou precisar, conforme exemplo abaixo:
@Consumes("application/json")
public void saveRecord(JsonObject json){
Set<Entry<String, JsonElement>> entrySet = json.entrySet();
RecordSet recordSet = extractRecordSet(entrySet); // RecordSet é um objeto que utilizo para armazenar os dados extraídos do JSON.
// A grande jogada aqui é percorrer o resultado de entrySet do JsonObject.
...
}
E por fim, a transmissão do JSON do lado cliente para o servidor foi feito conforme o exemplo abaixo:
$.ajax({
type : "POST",
url : url_post, // URL do Controller
data : JSON.stringify(data), // data = dados em formato JSON
contentType : 'application/json',
success : function(json) {
console.log('Concluído: ' + json)
},
dataType : "json"
});
Obrigado pelas dicas e pela força!