Jackson em projeto Spring Boot geram referência cíclica

Postado em por Wolmir Cezer Garbin em Java | 127 Visualizações
Última atualização em:

O Jackson é utilizado para conversão de objetos em json e vem sendo utilizado pelo spring a muito tempo. No Spring Boot comecei a ver referências cíclicas, neste post vou mostrar como resolver isso.

Se estiver com problema de referência cíclica utilizando um micro serviço em Spring Boot, Jackson e Lombok, este post vai te ajudar a resolver.

Versões utilizadas


  • Spring Boot 1.5.2.RELEASE
  • Jakson 2.8
  • Lombok 1.16.14

O problema

Quando criamos serviços utilizando spring boot e o jackson, pode acontecer de ter referência cíclica.

Para entender melhor o problema veja o código:

import lombok.*;
import javax.persistence.*;

@Entity
@Table(name = "MENU")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = {"id"})
public class Menu {

	@Id
	@Column(name = "ID")
	private Long id;

	// [...]

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "MENUPAI")
	private Menu menuPai;
				
	@OneToMany(mappedBy = "menuPai", fetch = FetchType.EAGER)
	private List<Menu> lsFilhos;
}

Sempre que um menu contiver filhos, este caregará os mesmos em uma lista de filhos os quais carregaram os pais, e assim cria uma sequência infinita de iterações, gerando erro na conversão.

Para resolver o problema podemos utilizar um @JsonIgnore, porém, se anotar a própriedade menuPai isso não vai funcionar. Analisando o problema percebemos que o Jackson obtem os valores a partir dos métodos get o qual é gerado pelo lombok, desta forma vamos mostrar a solução que encontramos.

A solução

Para nós a solução foi criar o método get da própriedade e anotar com @JsonIgnore. Veja o código com o problema resolvido:

import lombok.*;
import javax.persistence.*;

@Entity
@Table(name = "MENU")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = {"id"})
public class Menu {

	@Id
	@Column(name = "ID")
	private Long id;

	// [...]

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "MENUPAI")
	private Menu menuPai;
				
	@OneToMany(mappedBy = "menuPai", fetch = FetchType.EAGER)
	private List<Menu> lsFilhos;
	
	@JsonIgnore
	public AplicacaoMenu getMenuPai() {
		 return menuPai;
	}
}

Pronto! O problema será resolvido, qualquer dúvida poste nos comentários e te ajudaremos.

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar