Vraptor - NullPointerException durante serialização JSon

Boa tarde, estou tentando serializar com JSon de um objeto da classe ‘Pai’.

[code]class Pai{
List filhos;
}

class Filho{
Endereco endereco;
}

class Endereco{
String rua;
int numero;
}[/code]

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.

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

Obrigado

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

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

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

Obrigado.

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;

tenta usar o recursive()

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…

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?

[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.

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

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

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();

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

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:

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

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?

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

Valeu problema resolvido com o Custom rolou tudo certinho.