VRaptor + JSON

Bom dia Lucas,

Estou com o mesmo problema, mas eu não posso migrar para a versão 3.5 agora devido a problemas com a função linkTo.
Seguindo as dicas eu registrei o pacote:

<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<param-value>
			br.com.caelum.vraptor.converter.l10n, 
			br.com.caelum.vraptor.serialization.gson.adapters
		</param-value>
	</context-param>

E criei o JsonDeserializer para Calendar, mas ainda não funcionou.
Fazendo um teste com a classe Helper criada pelo Ribker funcionou, entretanto ficou um deserializer estático para um tipo.

@Deserializes("application/json")
public class Helper implements Deserializer {

    @Override    
    public Object[] deserialize(InputStream arg0, ResourceMethod arg1) {    
        Gson gson = new GsonBuilder().create();
        BufferedReader reader = new BufferedReader(new InputStreamReader(arg0));    
        Tarefa tarefa = gson.fromJson(reader, Tarefa.class);
        return new Object[]{ tarefa };
    }   
}

Como eu posso resolver mantendo a versão 3.4.1?

a versão 3.5.1 corrige os problemas do linkTo, tenta fazer a migração =)

show!!!
dois coelhos com a mesma cajadada…

só mais uma pergunta Lucas:

Não é possível enviar dois objetos?

public void metodo(Objeto1 objeto1, Objeto2 objeto2) { ... }

Tentei e o segundo está vindo nulo.

é possível sim… só usar os nomes dos inputs a partir dos nomes dos parametros:

objeto1.propriedade1
objeto1.propriedade2

objeto2.propriedade1
objeto2.propriedade2

lembrando que é o nome do parametro que vale, não o nome da classe.

usando json do angularjs?

var json = angular.toJson({ 
			obj1: {...}, 
			obj2: {...} 
		});

o primeiro chega mas o segundo não

vc consegue ver quais parametros foram na requisição? tipo usando o firebug ou o developer tools?

estão indo os dois (vide anexo):

assinatura do metodo:

@Consumes("application/json")
	@Put("/s/{tarefa.id}")
	public void s(Tarefa tarefa, Processo processo)


o @Consumes de json e de xml padrão só suportam um objeto =(

tenta criar essa classe na sua aplicação:

@Component
public void MeuGSonDeserializer extends GsonDeserialization {
   //delegate constructor
}

creio que isso deva resolver…

Não deu certo mas eu criei um wrapper.

Acha necessário criar uma issue ou é muito específico?

cria a issue sim, por favor…

mas só funcionaria com json, em xml isso já não faria sentido (já que tem que ter uma raíz única)

Lucas,

Fora a questão da deserialização de mais de um parâmetro, também estou tendo problemas com deserialização de subobjetos.
Quando uma propriedade é um outro objeto composto é deserializado nulo.

Ex.:
Meu objeto tarefa tem uma propriedade grupoAtendente, ela está chegando nula no controller, somente os tipos primitivos e seus wrappers estão chegando preenchidos.

O que fazer para tentar solucionar ou descobrir onde está o problema?

isso usando o gson ou o XStream?

o deserializer do vraptor não é recursivo?

o do XStream é, se eu não me engano… o do GSon eu não cheguei a testar esse caso.

Lucas,

Na verdade eu estava registrando o pacote errado.
Analisando as classes de deserialização vi que a classe do Gson está no pacote br.com.caelum.vraptor.deserialization.gson.

Registrei ele e passou a funcionar tudo, multiplos parâmetros e classes complexas.

Mas é necessário registrar o pacote de adapters também, então registrei estes dois:

br.com.caelum.vraptor.serialization.gson.adapters
br.com.caelum.vraptor.deserialization.gson