本文共 3497 字,大约阅读时间需要 11 分钟。
Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里
Problem
对象,引用了标签列表ProblemLabel
ProblemLabel
对象,引用了所属Problem
这样构成了互相引用,导致递归循环内存溢出异常:
org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.test.api.problem.domain.ProblemLabel["problem"]->com.test.api.problem.domain.Problem["label"]->org.hibernate.collection.internal.PersistentBag[0]->com.test.api.problem.domain.ProblemLabel["problem"]->com.test.api.problem.domain.Problem["label"]->org.hibernate.collection.internal.PersistentBag[0]->com.test.api.problem.domain.ProblemLabel["problem"]
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})@Entity@Table(name = "tx_test_problem")public class Problem { private static final long serialVersionUID = 761718569700121659L; /** * 问题概述 */ private String qutline; /** * 问题补充 */ private String supplement; /** * 创建时间 */ private Date createDate; private Account user; private Listlabeles; public String getQutline() { return qutline; } public void setQutline(String qutline) { this.qutline = qutline; } public String getSupplement() { return supplement; } public void setSupplement(String supplement) { this.supplement = supplement; } @OneToOne(fetch = FetchType.EAGER) @JoinColumn(name = "user_id") public Account getUser() { return user; } public void setUser(Account user) { this.user = user; } @Column(updatable = false) public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @OneToMany(mappedBy = "problem", fetch = FetchType.EAGER) //主表上添加mappedBy,指向关联表的关联实体problem即可 public List getLabel() { return labeles; } public void setLabel(List labeles) { this.labeles = labeles; }}
Problem包含了标签列表private List<ProblemLabel> labeles;
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})@Entity@Table(name = "tx_test_problem_label")public class ProblemLabel { private static final long serialVersionUID = -789585899105406906L; private String labelVal; private String problemId; private Problem problem; @ManyToOne @JoinColumn(name = "problem_id") public Problem getProblem() { return problem; } public void setProblem(Problem problem) { this.problem = problem; } public String getLabelVal() { return labelVal; } public void setLabelVal(String labelVal) { this.labelVal = labelVal; }}
ProblemLabel包含了标签列表private Problem problem;
在不需要展现一方的属性上添加忽略注解@JsonIgnore
即可。修改后的ProblemLabel
如下。
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})@Entity@Table(name = "tx_test_problem_label")public class ProblemLabel { private static final long serialVersionUID = -789585899105406906L; private String labelVal; private String problemId; private Problem problem; @ManyToOne @JoinColumn(name = "problem_id") @JsonIgnore //将不需要返回的属性上添加忽略 public Problem getProblem() { return problem; } public void setProblem(Problem problem) { this.problem = problem; } public String getLabelVal() { return labelVal; } public void setLabelVal(String labelVal) { this.labelVal = labelVal; }}
这样便可解决bean互相引用返回json数据时递归调用的问题。
转载地址:http://wusva.baihongyu.com/