Vraptor - NullPointerException durante serialização JSon

16 respostas
Jeferson_Flamini
Boa tarde, estou tentando serializar com JSon de um objeto da classe 'Pai'.
class Pai{
   List<Filho> filhos;
}

class Filho{
   Endereco endereco;
}

class Endereco{
   String rua;
   int numero;
}
Se tenho um pai, com 2 filhos mas um dos filhos tem o endereço null, quando é executada a serialização ocorre 'NullPointerException" por causa deste deste ponteiro null do endereço.
result.use(json()).from(pai).include("filhos").include("filho.endereco").serialize()

Alguém sabe se existe alguma maneira de contornar esta situação?

Obrigado

16 Respostas

G

Cole aqui um trecho do stacktrace para ver onde é o NullPointerException.

Lucas_Cavalcanti

Jeferson, o certo seria se referenciar pelos atributos:

result.use(json()).from(pai).include("filhos").include("filhos.endereco").serialize()

ou seja, filhos, e não filho

Jeferson_Flamini

Era isso mesmo Lucas.
Putz, que vergonha. Que comida de bola.

Obrigado.

jingle

Estou com problema para serializar também.

meu caso:

result.use(Results.json()).withoutRoot().from(produtos)
				.include("fichasTecnica")
				.include("fichasTecnica.fichaTecnicaItens")
				.include("fichasTecnica.fichaTecnicaItens.materiaPrima")
				.serialize();

Ou seja tenho uma List chamada de produtos, e cada produto tem uma lista de ficha técnica, e cada ficha técnica tem vários itens e cada item tem uma matéria prima.

só que nessa lista de produtos tem umas que nem se quer tem fichasTecnicas ( isso seria um problema?).

se eu olho no firebug ta assim:
só mostra UM produto (sendo que na minha list na controller tem 3) e seus atributos, e na parte da ficha técnica ta assim:

"fichasTecnica": [
      false,
      {
        "@class": "produto"

model Produto:

@ManyToMany(targetEntity = FichaTecnica.class, fetch = FetchType.LAZY)
	@JoinTable(name = "produto_ficha_tecnica", joinColumns = @JoinColumn(name = "produto_id"), inverseJoinColumns = @JoinColumn(name = "ficha_tecnica_id"))
	private List<FichaTecnica> fichasTecnica;

model ficha técnica:

@Valid
	@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@OneToMany(targetEntity = FichaTecnicaItem.class, mappedBy = "fichaTecnica", cascade = CascadeType.ALL)
	private List<FichaTecnicaItem> fichaTecnicaItens;

model ficha técnica itens:

@ManyToOne(fetch = FetchType.EAGER)
	@NotNull(message = "Campo 'matéria prima' deve ser preenchido.")
	@JoinColumn(nullable = false, name = "materia_prima_id")
	private MateriaPrima materiaPrima;
Lucas_Cavalcanti

tenta usar o recursive()

jingle

por acaso tem algum limite de tamanho a resposta do json? porque parece que ta cortando

[
  {
    "id": 3,
    "usuarioMaster": {
      "id": 1,
      "nome": "teste-01",
      "status": "1",
      "configSistema": {
        "id": 1,
        "status": "1",
        "usuarioMaster":

ai ta o exemplo ele nem ta fechando todas chaves…

Lucas_Cavalcanti

ele para de gerar o json pq dá algum erro (deve ter uma exception no console do server)

qual é o nullpointer que deu no primeiro caso?

jingle
[org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/ERP-teste].[default]] Servlet.service() for servlet default threw exception: 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:92)
	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.teste.erp.interceptor.AuthorizationInterceptor.continuaExecucao(AuthorizationInterceptor.java:125)
	at br.com.teste.erp.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:97)
	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:274)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:276)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:183)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:95)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
	at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:872)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)
	at java.lang.Thread.run(Unknown Source)
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.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.converters.collections.AbstractCollectionConverter.writeItem(AbstractCollectionConverter.java:64)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.marshal(CollectionConverter.java:55)
	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.teste.erp.controller.core.ProdutoController.loadProdutoByFamiliaProduto(ProdutoController.java:347)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	... 49 more

não foi nullpointer foi ->CircularReferenceException (tanto antes como agora), pelo nome imagino que seja um modelo que tem mapeamento circular, é isso?

Estou tentando achar a referencia circular e não estou encontrando de jeito nenhum.
Pois quando serializo só o produto funciona.
no momento que dou include nas fichasTecnica já da referencia circular, mas eu dei um exclude de todos objeto/model que tem na ficha técnica dexei somente os int, string, long da vida.

Lucas_Cavalcanti

vc está serializando a partir de uma consulta do hibernate, certo?

qual é a versao do vraptor que vc tá usando?

jingle

Sim é a partir de uma consulta do hibernate.
Versão do vraptor é a 3.1.3 a do xstream é 1.3.1

Todos Campos da minha ficha técnica:

@Id
	@SequenceGenerator(name = "sequence", sequenceName = "seq_ficha_tecnica")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "sequence")
	private Long id;

	@NotEmpty(message = "Campo 'descricao' deve ser preenchido.")
	@Length(max = 100, message = "Campo 'descricao' ultrapassa o tamanho máximo de 100 caracteres.")
	@Column(length = 100, nullable = false)
	private String descricao;

	@ManyToOne(fetch = FetchType.EAGER)
	@NotNull(message = "Campo 'categoria' deve ser preenchido.")
	@JoinColumn(nullable = false, name = "categoria_ficha_tecnica_id")
	private CategoriaFichaTecnica categoriaFichaTecnica;

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "ficha_tecnica_id")
	private FichaTecnica fichaTecnica;

	@ManyToOne(fetch = FetchType.EAGER)
	@NotNull(message = "Campo 'tipo de registro de ficha técnica' deve ser preenchido.")
	@JoinColumn(nullable = false, name = "tipo_registro_ficha_tecnica_id")
	private TipoRegistroFichaTecnica tipoRegistroFichaTecnica;

	@NotNull(message = "Campo 'valor total' deve ser preenchido.")
	@Digits(integerDigits = 8, fractionalDigits = 2, message = "Campo 'valor total' preenchido incorretamente. Parte inteira deve ter no máximo 8 dígitos e parte fracionária deve ter no máximo 2 dígitos.")
	@Column(nullable = false, name = "valor_total", precision = 10, scale = 2)
	private BigDecimal valorTotal;

	@NotEmpty(message = "Campo 'status' deve ser preenchido.")
	@Length(max = 1, message = "Alguma informação inválida foi carregada no campo 'status'. Tente preencher os campos novamente. Caso o erro persista, entre em contato com o administrador do sistema.")
	@Column(nullable = false, length = 1)
	private String status;

	@Valid
	@Cascade(value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@OneToMany(targetEntity = FichaTecnicaItem.class, mappedBy = "fichaTecnica", cascade = CascadeType.ALL)
	private List<FichaTecnicaItem> fichaTecnicaItens;

Modo em que o Serialize Funciona:

result.use(Results.json()).withoutRoot().from(produtos).serialize();

Modo que NÃO funciona:

result.use(Results.json()).withoutRoot().from(produtos).include("fichasTecnica").exclude("fichasTecnica.fichaTecnica")
		  .exclude("fichasTecnica.categoriaFichaTecnica")
		  .exclude("fichasTecnica.TipoRegistroFichaTecnica")
		  .exclude("fichasTecnica.fichaTecnicaItens").serialize();
Lucas_Cavalcanti

testa isso por favor na versão mais nova do vraptor… isso teoricamente já foi corrigido.

jingle

Olá demorei um pouco porque pra atualizar o vraptor acabei tendo alguns outros problemas com as lib.

Mas infelizmente meu problema de referencia circular continua :confused:

Lucas_Cavalcanti

dá uma olhada: http://www.wbotelhos.com.br/2010/08/26/vraptor-3-evitando-circularreferenceexception-do-xstream/

jingle

Ok fazendo com custom funcionou!!

customJSONSerialization.withoutRoot().from(produtos)
				.include("fichasTecnica").exclude("fichasTecnica.fichaTecnica")
				.exclude("fichasTecnica.categoriaFichaTecnica")
				.exclude("fichasTecnica.TipoRegistroFichaTecnica")
				.exclude("fichasTecnica.fichaTecnicaItens").serialize();

mas como faço pro result.use(Results.json()) utilizar o custom?

Lucas_Cavalcanti

é só anotá-lo com @Component :wink:

jingle

Valeu problema resolvido com o Custom rolou tudo certinho.

Criado 27 de agosto de 2011
Ultima resposta 2 de set. de 2011
Respostas 16
Participantes 4