es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

  1. 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;

}
  1. 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<>();

}
  1. 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;
}
“`

Tags:  , ,

Answer

  1. Avatar for 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.

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id_address")
    @JsonBackReference
    private Address address;
    

    En la entidad Address, @JsonManagedReference debería ser cancelado para el campo de propiedad.

    @OneToOne(mappedBy = "address")
    @JsonManagedReference
    private Property property;
    

    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.

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id_address")
    @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;
    } 
    

    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.

Comments are closed.