>我有两个表部门和员工。部门是员工的父级,两者都由department_id加入。
部门
@Entity
public class Department {
@Override
public String toString() {
return "Department [departmentId=" + departmentId + ", departmentName=" + departmentName + "]";
}
@Id
public Integer departmentId;
public String departmentName;
@OneToMany(mappedBy = "department",fetch=FetchType.LAZY)
public Set<Employee> employees;
}
员工
@Entity
public class Employee {
@Override
public String toString() {
return "Employee [employee_id=" + employeeId + ", employee_name=" + employeeName + ", department="
+ department + "]";
}
@Id
public Integer employeeId;
public String employeeName;
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;
}
当我尝试检索所有部门详细信息时,它正在创建一个循环依赖项,杰克逊抛出以下错误。所以我想知道如何处理这种情况,您需要灵活地从父级访问子详细信息并从子级访问父级详细信息。
2017-08-01 12:03:13.245 WARN 18197 --- [o-auto-1-exec-3]
.w.s.m.s.DefaultHandlerExceptionResolver : Failed to write HTTP message:
org.springframework.http.converter.HttpMessageNotWritableException: Could not
write JSON: Infinite recursion (StackOverflowError); nested exception is
com.fasterxml.jackson.databind.JsonMappingException:
我能够使用以下方法@JsonIgnoreProperties实现此解决方案。通过使用这种方式,我能够在员工中获取部门和部门级别详细信息中的员工详细信息,并避免无限递归
@JsonIgnoreProperties("department")
@OneToMany(mappedBy = "department",fetch=FetchType.EAGER)
public Set<Employee> employees;
@JsonIgnoreProperties("employees")
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;
您可以使用@JsonManagedReference
和@JsonBackReference
:
@JsonBackReference
public Department department;
和部门模型
@JsonManagedReference
public Set<Employee> employees
它现在应该可以工作:)
是的,这是意料之中的,杰克逊将迭代您的引用,并且由于关系是双向的,因此它将卡在无限操作中。
要解决此问题,您可以使用@JsonIgnore
忽略序列化关系的一侧以中断循环
@Entity
public class Employee {
@Override
public String toString() {
return "Employee [employee_id=" + employeeId + ", employee_name=" + employeeName + ", department="
+ department + "]";
}
@Id
public Integer employeeId;
public String employeeName;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "departmentId")
public Department department;
}