避免无限循环 Spring Boot

Posted

技术标签:

【中文标题】避免无限循环 Spring Boot【英文标题】:Avoiding Infinite Loop Spring Boot 【发布时间】:2022-01-15 17:22:03 【问题描述】:

在 Spring Boot Rest API 中,我能够使用 @JsonIgnore 避免无限循环。在邮递员结果中,相关列表(多方)显示为空。当我将在 Angular 中使用此端点时,即使在我的邮递员中被 @JsonIgnore 跳过,我是否能够显示该相关列表?

考虑 MatierePlannificationConcours 之间的关系,它有一些其他的孩子,如何避免无限循环并返回 null 值。

一侧

@Data
@AllArgsConstructor
@Table(name="Matiere")
public class Matiere extends Audit<String>  implements Serializable 

    @Column(name="ID", nullable=false, length=10)   
    @Id 
    @GeneratedValue(generator="PNU_MATIERE_ID_GENERATOR")   
    @org.hibernate.annotations.GenericGenerator(name="PNU_MATIERE_ID_GENERATOR", strategy="native") 
    private int id;
    
//  @ManyToOne(targetEntity=fdsa.edu.PNUFDSA.Model.Matiere.class, fetch=FetchType.LAZY) 
//  @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.LOCK)    
//  @JoinColumns(value= @JoinColumn(name="MatiereID", referencedColumnName="ID", nullable=false) , foreignKey=@ForeignKey(name="Pre-requis")) 
//  private fdsa.edu.PNUFDSA.Model.Matiere matiere;
    
    @Column(name="Description", nullable=true, length=255)  
    private String description;
    
    @Column(name="Code", nullable=true, length=255) 
    private String code;
    
    @Column(name="Contenu", nullable=true, length=255)  
    private String Contenu;
    
    @Column(name="NombreDeCreditStandard", nullable=false, length=10)   
    private int nombreDeCreditStandard;

    @OneToMany(mappedBy="matiere", targetEntity= Cours.class)
    private List<Cours> cours ;

    @JsonManagedReference
    @OneToMany(mappedBy="matiere", targetEntity= PlannificationConcours.class)
    private List<PlannificationConcours> plannificationConcourses;

    public Matiere() 
    

多方面

@Entity

@AllArgsConstructor

@Table(name="PlannificationConcours")
public class PlannificationConcours  extends Audit<String> implements Serializable 
    public PlannificationConcours() 
    
    
    @Column(name="ID", nullable=false, length=10)   
    @Id 
    @GeneratedValue(generator="PNU_PLANNIFICATIONCONCOURS_ID_GENERATOR")    
    @org.hibernate.annotations.GenericGenerator(name="PNU_PLANNIFICATIONCONCOURS_ID_GENERATOR", strategy="native")  
    private int id;

    @ManyToOne (targetEntity= Concours.class, fetch=FetchType.LAZY)
    @JoinColumns(value= @JoinColumn(name="concoursId", referencedColumnName="ID", nullable=true) , foreignKey=@ForeignKey(name="ConcoursPlanificationConcours"))
    //@JsonBackReference
    private Concours concours;

    @JsonBackReference
    @ManyToOne(targetEntity= Matiere.class, fetch=FetchType.LAZY)
    @JoinColumns(value= @JoinColumn(name="MatiereId", referencedColumnName="ID", nullable=true) , foreignKey=@ForeignKey(name="MatierePlanificationConcours"))
    private Matiere matiere;
    
    @Column(name="`Date`", nullable=true)   
    @Temporal(TemporalType.DATE)    
    private java.util.Date Date;
    
    @Column(name="Quotation", nullable=false, length=10)    
    private double quotation;
    
    @Column(name="NoteDePassage", nullable=false, length=10)    
    private double noteDePassage;
    

    @OneToMany(mappedBy="plannificationConcours", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity= HistoriqueExamenConcours.class)
    private List<HistoriqueExamenConcours> historiqueExamenConcours;

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public Concours getConcours() 
        return concours;
    

    public void setConcours(Concours concours) 
        this.concours = concours;
    
    
    public Matiere getMatiere() 
        return matiere;
    

    public void setMatiere(Matiere matiere) 
        this.matiere = matiere;
    

    public java.util.Date getDate() 
        return Date;
    

    public void setDate(java.util.Date date) 
        Date = date;
    

    public double getQuotation() 
        return quotation;
    

    public void setQuotation(double quotation) 
        this.quotation = quotation;
    

    public double getNoteDePassage() 
        return noteDePassage;
    

    public void setNoteDePassage(double noteDePassage) 
        this.noteDePassage = noteDePassage;
    

    public List<HistoriqueExamenConcours> getHistoriqueExamenConcours() 
        return historiqueExamenConcours;
    

    public void setHistoriqueExamenConcours(List<HistoriqueExamenConcours> historiqueExamenConcours) 
        this.historiqueExamenConcours = historiqueExamenConcours;
    

邮递员回复

    "id": 2,
    "description": "Prgrammation C#",
    "code": "C Sharp",
    "nombreDeCreditStandard": 2,
    "cours": [],
    "contenu": "C#",
    "plannificationConcours": null
```

【问题讨论】:

请分享相关代码,并尝试通过用例更清楚您的问题 【参考方案1】:

您必须首先了解您的前端(Angular)和后端(Spring Boot)是两个独立的应用程序。

我能够使用@JsonIgnore 避免无限循环。在邮递员 结果,相关列表(多方)显示为空。

因此,您已通过修改返回对象转换为 JSON 对象的方式来修改后端以不进入不定式循环。如果您的后端在转换为 JSON 对象时会陷入不定式循环,现在将在此时写入空值以避免不定式循环。

当我将在 Angular 中使用此端点时,我是否能够显示 该相关列表即使在我的邮递员中被@JsonIgnore 跳过

您的 Angular 应用程序将收到您的邮递员收到的内容,也就是您后端的答案。所以答案是否定的。

【讨论】:

以上是关于避免无限循环 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot JPA无限循环多对多

如何在 Spring Boot 中使用 JsonIgnore 来停止无限循环? [复制]

这种在 Spring Boot 应用程序中启动无限循环的方式有啥问题吗?

在 Spring boot 中使用 post 方法保存多个实体时的无限循环

JPA Spring Boot 微服务 - 使用两个多对一映射持久化实体时的无限循环

componentDidUpdate 创建无限循环,不知道如何避免它