Json Deserializer com VRaptor

Olá, boa tarde!

Estou tentando “Deserializar” um Json com o VRaptor e está ocorrendo o seguinte erro:

[code]Servlet.service() for servlet [default] in context with path [/estige] threw 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 : br.com.aurum.estige.representacoes.Pesquisa
required-type : java.util.ArrayList
line number : -1

at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)...[/code]

Alguém poderia me ajudar? Não estou conseguindo identificar o problema.

Segue o arquivo do Json

{"pesquisa" : { "parametros" : [ { "valor" : "0106900", "campo" : "numero" } ], "codigoDeVinculo" : 6173}

Muito Obrigado.

Se o JSON for esse mesmo, falta fechar uma chave… Tem três abrindo e só duas fechando…

Desculpa, eu postei errado mesmo. Existe a chave sim, eu quem comi ela ali!

Alguém mais??

a deserialização atual do vraptor não é mto boa… tente usar esse plugin:

[quote=Lucas Cavalcanti]a deserialização atual do vraptor não é mto boa… tente usar esse plugin:

https://github.com/renanreismartins/vraptor-gson[/quote]

Obrigado Lucas.

Mais desculpa a minha ignorância, eu adicionei “vraptor-gson-1.1.jar” no classpath do meu projeto e o mesmo problema ocorre. Eu preciso fazer mais alguma coisa?

Também estou usando o VRaptor 3.2.0, será que é necessário atualizar?

Lucas, vi aqui nesse tópico http://www.guj.com.br/java/277124-web-service—vraptor–json o mesmo problema que o meu, e vc também indicou utilizar o Gson.

Eu estava utilizando está classe para deserializar o Json, pois no mesmo projeto eu deserializava em XML, então simplesmente criei esssa classe abaixo para o JSON…


@Component
@Deserializes("application/json")
public class CustomJsonDeserializer extends JsonDeserializer {

	public CustomJsonDeserializer(final ParameterNameProvider provider,
			final TypeNameExtractor extractor) {
		super(provider, extractor);
	}

	@Override
	protected XStream getXStream() {
		final XStream xStream = super.getXStream();
		xStream.alias("cliente", Cliente.class);
		xStream.alias("pesquisa", Pesquisa.class);
		xStream.alias("parametro", Parametro.class);
		xStream.alias("fornecedor", Fornecedor.class);
		xStream.processAnnotations(Cliente.class);
		return xStream;
	}
}

Então, com o Gson eu preciso criar uma classe que extend a GsonDeserialization?

tenta só registrar o pacote do plugin… teoricamente não precisa criar uma classe assim.

Lucas, obrigado pela resposta.

Tentei aqui, adicionei o pacote do plugin no classpath e dá o erro

GRAVE: Servlet.service() for servlet [default] in context with path [/estige] threw exception com.thoughtworks.xstream.mapper.CannotResolveClassException: pesquisa : pesquisa at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38) at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71) at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)

Então eu criei a classe

[code]import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.deserialization.Deserializes;
import br.com.caelum.vraptor.deserialization.gson.GsonDeserialization;
import br.com.caelum.vraptor.http.ParameterNameProvider;
import br.com.caelum.vraptor.ioc.Component;

@Component
@Deserializes(“application/json”)
public class EstigeJsonDeserializer extends GsonDeserialization{

public EstigeJsonDeserializer(final ParameterNameProvider paramNameProvider,
		final Localization localization) {
	super(paramNameProvider, localization);
}

}
[/code]

Não deu erro, mais também não “deserializou” meu arquivo de json. Entrou no método mais trouxe o objeto vazio…
Não sei o que pode ser…

Segue a chamada do método da minha classe

@Post
	@Consumes("application/json")
	@Path("/cliente/{idDoCliente}/consulta/{idDaConsulta}/pesquisa")
	public void buscaProcesso(final int idDoCliente, final int idDaConsulta, final Pesquisa pesquisaRealizada) {
        ...
}

tenta colocar esse cara: final Pesquisa pesquisaRealizada como primeiro parâmetro do método

mesmo fazendo isso o objeto pesquisa está nulo.

A minha classe “Pesquisa” está assim…

@XStreamAlias("pesquisa")
public class Pesquisa {

	private int codigoDeVinculo;

	private List<Parametro> parametros = new ArrayList<Parametro>();

	public Pesquisa() {}

	public Pesquisa(final int codigoDeVinculo, final List<Parametro> parametros) {
		this.codigoDeVinculo = codigoDeVinculo;
		this.parametros = parametros;
	}

Como o projeto utilizava xml, está com a notação @XStreamAlias(“pesquisa”), eu não preciso fazer alguma coisa do tipo para o Gson?

se vc quiser continuar a tentar com o XStream, o formato que ele espera seria assim:

    {"pesquisa" : {  
      "parametros" : [  
        { "parametro": {  
          "valor" : "0106900",  
          "campo" : "numero"  
        } }
      ],  
      "codigoDeVinculo" : 6173}  

se estiver sem o alias, vc precisa colocar a classe inteira do parâmetro.

então caso a minha lista de parametros tenha mais que um parametro o json deve ser assim:



{"pesquisa" : {    
  "parametros" : [    
    { "parametro": {    
      "valor" : "0106900",    
      "campo" : "numero"    
    } }  
	{ "parametro": {    
      "valor" : "0000000",    
      "campo" : "numero2"    
    } }  
  ],    
  "codigoDeVinculo" : 6173}   

???

algo assim, faltou uma virgula aí na linha 6 só

Boa Lucas!!! :smiley:

O arquivo do Json desse jeito que vc disse funcionou no XStream. O chato agora é gerar um arquivo Json desse jeito no xcode hehehe

Valeu, muito obrigado pela ajuda.

só para deixar registrado, caso alguém tenha o mesmo problema p/ “deserializar” em uma classe que possua uma lista de objetos, o modelo do Json deve ser assim:

{
  "pesquisa": {
    "parametros": {
      "parametro": [
        {
          "valor": "0106900",
          "campo": "numero"
        },
        {
          "valor": "4444444",
          "campo": "numero2"
        }
      ]
    },
    "codigoDeVinculo": "6173"
  }
}

nos posts acima tem o exemplo da classe que esse modelo está “deserializando”

:wink:

Pessoal,

Estou tentando usar o plugin (https://github.com/renanreismartins/vraptor-gson/). Já adicionei o pacote do plugin mas quando vou deserializar pego a exceção de que ele não está conseguindo instanciar o gsonDeserialization. Alguma luz?

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'gsonDeserialization': Unsatisfied dependency expressed through constructor argument with index 1 of type [java.util.Collection]: : No matching bean of type [com.google.gson.JsonDeserializer] found for dependency [collection of com.google.gson.JsonDeserializer]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.google.gson.JsonDeserializer] found for dependency [collection of com.google.gson.JsonDeserializer]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}

vc registrou o pacote dele no web.xml?

Defini os seguintes pacotes

<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<param-value>br.com.caelum.vraptor.deserialization, br.com.caelum.vraptor.serialization</param-value>
	</context-param>

põe .gson na frente desses dois pacotes e tente de novo.

Já tinha tentado e tentei novamente. Mesma situação :confused: