NullPointerException - JSON VRaptor

15 respostas
Lucas_Cavalcanti

por padrão o vraptor só serializa atributos simples (String, números, datas e boolean), se vc quiser serializar o Set, vc tem que dar um include nessa propriedade, ou se quiser incluir tudo por sua conta e risco, chamar o metodo recursive…

result.use(json()).from(departamento).include("secoes").serialize();

15 Respostas

Lucas_Cavalcanti

tenta chamar a url do json no browser e ver o que vem…

Lucas_Cavalcanti

sim, por isso vc não pode usar o recursive() sempre…
se vc tiver um ciclo nos relacionamentos entre os objetos o recursive não vai funcionar

use includes…

Lucas_Cavalcanti

tire o recursive

Lucas_Cavalcanti

ele não gera o json completo?

vc tah rodando em qual browser? tenta abrir no firefox e baixar o json gerado

Lucas_Cavalcanti

vc tah com a última versão do vraptor?

a secoes é uma lista de Departamento? ou de algo que estende departamento?

Lucas_Cavalcanti

então… ele deveria parsear as coleções sem problemas…

vc consegue reproduzir esse bug com classes simples, a partir do blank project?

seufagner

Pessoal

Estou tomando NPE tentando receber um JSON.

No Controller a entidade está sendo encontrada. Alguém tem idéia do que possa vir a ser?

javascript

$("select#departamento").change(function(){
		$.post("<c:url value="/departamento/load.json" />",{id: $(this).val()}, function(j){
			alert(j);

		},'json');
	});

Controller

@Get
	@Path("/departamento/load.json")
	public void loadJson(Long id) {
		Departamento departamento = departamentoDao.getById(id);

		result.of(Results.json()).from(departamento).serialize();
	}

trace

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:86)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.atttecnologia.ecommerce.web.component.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:18)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NullPointerException
	at br.com.atttecnologia.ecommerce.web.controller.DepartamentoController.loadJson(DepartamentoController.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	... 43 more
seufagner

Er… dei mole… Era so ter usado use()

seufagner

Tenho uma entidade onde Departamento contém um Set.

O XStream consegue fazer o parser ? Pois, de qualquer forma, chega um Object via JSON e eu não consigo acessar nenhum atributo da entidade Departamento.

seufagner

Eu havia tentado isto mas não funcionou.

Eu recebo um Object (visto em um alert javascript). Os atributos simples de Departamento, como descrição, também não são recuperados.

seufagner

Obrigado Lucas.

O parser do JSON se perde. Acredito que é porque há um relacionamento bidirecional e, colocando recursive(), deve dar pau…

{"departamento": {
  "id": 2,
  "descricao": "Cine e Foto",
  "secoes": [
    true,
    {
      "@class": "departamento"
seufagner

com include(“secoes”) tem como resultado exatamente a saída que informei acima.

no caso teria que excluir a entidade departamento na coleção.

Caused by: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException: 
	at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:83)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:78)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:157)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:148)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.visit(AbstractReflectionConverter.java:118)
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:129)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:100)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:58)
	at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:86)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:78)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:157)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:148)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.visit(AbstractReflectionConverter.java:118)
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:129)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:100)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:58)
	at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:86)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:78)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:63)
	at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:98)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:38)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:837)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:826)
	at com.thoughtworks.xstream.XStream.toXML(XStream.java:801)
	at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.serialize(XStreamSerializer.java:225)
	at br.com.atttecnologia.ecommerce.web.controller.DepartamentoController.loadJson(DepartamentoController.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	... 43 more
seufagner

obrigado lucas

não tem recursive. dá o mesmo erro (vem quebrado o json), porém, sem excessão

seufagner

não, gera o JSON que informei.

{"departamento": {
  "id": 2,
  "descricao": "Cine e Foto",
  "secoes": [
    true,
    {
      "@class": "departamento"

Rodei no Firefox e no Chrome já. Não sei usar o IE. rs

seufagner

É um cara independente.

Estou com o snapshot vraptor-3.1.3-20100428.160403-2.jar

Trata-se de um cadastro de produtos, que envolve várias entidades e nem todas são relacionadas. Produto não tem o Departamento (este que contém todas as seções). O mesmo pertence apenas a um Departamento e a uma Seção (isto pode mudar, por enquanto deixei assim), entre várias outras entidades.

Como paliativo, estou passando a colecao diretamente e criei um Mediator com todas as entidades e ações necessárias para o cadastro de um Produto .

Achei que, naturalmente, o JSON ‘parseava’ as coleções. Contudo seria muito bom que pudesse manipular o grafo de objetos para, com isso, trazer apenas o que eu quero no JSON.

Existe algo no VRaptor que me possibilite isso? Como estou com pouco tempo não implementaria agora, mas numa folga.

Obrigado novamente;

Criado 5 de maio de 2010
Ultima resposta 5 de mai. de 2010
Respostas 15
Participantes 2