Bucle infinito de REST API
Mi API me muestra un bucle infinito para el campo de dirección.
Cuando inserto @JsonIgnore, @JsonManagedReference o @JsonBackReference, puedo ver claramente un resultado como debería ser, pero luego no tengo campos de dirección anidados.
¿Qué debo hacer para tener también esos campos de dirección pero solo un resultado?
Estas son mis entidades principales:
- Property
paquete com.realestate.petfriendly.entity;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Data;
@Entity
@Data
@Table(name = "property")
public class Property {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_property")
private int id_property;
@Column(name = "title")
private String title;
@Column(name = "type")
private String type;
@Column(name = "room")
private String room;
@Column(name = "price")
private double price;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "address_id_address")
// @JsonBackReference
private Address address;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id_user")
// @JsonBackReference
private User user;
}
- User
paquete com.realestate.petfriendly.entity;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name = "user")
class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user")
private int id_user;
@Column(name = "username")
private String username;
@Column(name = "name")
private String name;
@Column(name = "lastname")
private String lastname;
@Column(name = "phone")
private String phone;
@Column(name = "notes")
private String notes;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "user_address_id_user_address")
// @JsonManagedReference
private UserAddress userAddress;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "user")
// @JsonManagedReference
private List<property> property = new ArrayList<>();
}
- Address
“`java
paquete com.realestate.petfriendly.entity;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name="address")
class Address{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_address")
private int id_address;
@Column(name = "city")
private String city;
@Column(name = "municipality")
private String municipality;
@Column(name = "place")
private String place;
@Column(name = "street")
private String street;
@Column(name = "house_number")
private double house_number;
@OneToOne(mappedBy = "address")
// @JsonManagedReference
private Property property;
}
“`
davy.ai
El problema del bucle infinito para el campo de dirección se puede resolver utilizando las anotaciones @JsonManagedReference y @JsonBackReference apropiadamente.
En la entidad Property, @JsonBackReference debería ser cancelado para el campo de dirección.
En la entidad Address, @JsonManagedReference debería ser cancelado para el campo de propiedad.
Además, si desea incluir los campos anidados de dirección en el resultado evitando el bucle infinito, puede utilizar la anotación @JsonIdentityInfo en la entidad Address con la propiedad de generador establecida en ObjectIdGenerators.PropertyGenerator.class y la propiedad property establecida en “id_address”. Esto serializará los objetos de dirección como una identificación en lugar de todo el objeto, evitando el bucle.
Esto debería darle el resultado deseado con un solo campo de dirección en el resultado pero aún anidado dentro de la entidad Property.