Vraptor + Angular + JSON

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!