Saltar al contenido

Elimine JSON circular en Java Spring Relación de muchos a muchos

Nuestro equipo de expertos despúes de muchos días de investigación y recopilar de información, hemos dado con la solución, queremos que te sea de gran utilidad para tu trabajo.

Solución:

lo he resuelto He hecho un serializador personalizado. Entonces, en el grupo, serializaré a los estudiantes configurando una anotación personalizada @JsonSerialize(usando = CustomStudentSerializer.class)

CustomStudentSerializer

public class CustomStudentSerializer extends StdSerializer> 

    public CustomStudentSerializer() 
        this(null);
    

    public CustomStudentSerializer(Class> t) 
        super(t);
    

    @Override
    public void serialize(
            List students,
            JsonGenerator generator,
            SerializerProvider provider)
            throws IOException, JsonProcessingException 

        List studs = new ArrayList<>();
        for (Student s : students) 
            s.setGroups(null);
            studs.add(s);
        
        generator.writeObject(studs);
    

Hizo lo mismo para los grupos. Acabo de eliminar el componente de estudiantes/grupo cuando la relación ya está anidada. Y ahora funciona bien.

Me tomó un tiempo resolver esto, pero lo publiqué aquí porque también puede ayudar a alguien más.

Utilizando el @JsonIgnoreProperties anotación es otra alternativa:

@Entity
public class Student extends AbstractUser 
    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Group.class)
    @JoinTable(name = "GROUPS_STUDENTS",
            joinColumns =  @JoinColumn(name = "student_id") ,
            inverseJoinColumns =  @JoinColumn(name = "group_id") )
    @JsonIgnoreProperties("students")
    private List groups = new ArrayList();


@Entity
public class Group implements Item, Serializable 
    @ManyToMany(mappedBy = "groups", targetEntity = Student.class)
    @JsonIgnoreProperties("groups")
    private List students;

Encuentra la comparación entre @JsonManagedReference+@JsonBackReference, @JsonIdentityInfo y @JsonIgnoreProperties aquí: http://springquay.blogspot.com/2016/01/new-approach-to-solve-json-recursive.html

Para resolver la recursividad infinita de jackson puedes usar @JsonManagedReference, @JsonBackReference.

@JsonManagedReference es la parte delantera de la referencia, la que se serializa normalmente.

@JsonBackReference es la parte posterior de la referencia; se omitirá de la serialización.

Encuentre más detalles aquí: http://www.baeldung.com/jackson-bidireccional-relationships-and-infinite-recursion

public class Student extends AbstractUser 
    @ManyToMany(fetch = FetchType.LAZY, targetEntity = Group.class)
    @JoinTable(name = "GROUPS_STUDENTS",
            joinColumns =  @JoinColumn(name = "student_id") ,
            inverseJoinColumns =  @JoinColumn(name = "group_id") )
    @JsonManagedReference
    private List groups = new ArrayList();


public class Group implements Item, Serializable 
    @ManyToMany(mappedBy = "groups", targetEntity = Student.class)
    @JsonBackReference
    private List students;

Si haces scroll puedes encontrar los informes de otros desarrolladores, tú todavía eres capaz insertar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *