Java Hibernate json无限递归与自引用类

class级员工:

@Entity @Table(name = "Employee") public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "EmployeeID") private int EmployeeID; @Column(name = "ManagerID") private Integer ManagerID; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name="ManagerID", insertable = false, updatable = false) @JsonBackReference private Employee manager; @OneToMany(mappedBy="manager") @JsonManagedReference private Set employees; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "DepartmentID") private Department department; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "SalaryTypeID") private SalaryType salaryType; @Column(name = "Name") private String Name; //setters and getters here, wont be posting them } 

每当我创建一个员工实例时,我都会遇到这个无限的json错误:

 SEVERE: Servlet.service() for servlet [SpringMVC] in context with path [/SpringMVC] threw exception [Handler processing failed; nested exception is java.lang.StackOverflowError] with root cause java.lang.StackOverflowError at java.nio.CharBuffer.(Unknown Source) at java.nio.HeapCharBuffer.(Unknown Source) at java.nio.CharBuffer.wrap(Unknown Source) at sun.nio.cs.StreamEncoder.implWrite(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at sun.nio.cs.StreamEncoder.write(Unknown Source) at java.io.OutputStreamWriter.write(Unknown Source) at java.io.Writer.write(Unknown Source) at com.google.gson.stream.JsonWriter.string(JsonWriter.java:534) at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) at com.google.gson.stream.JsonWriter.value(JsonWriter.java:495) 

(然后它继续)

由于我是自我引用经理,这是员工类中的员工,我该如何解决这个问题?

有很多选择取决于您的要求:

1) @JsonIgnore可用于避免字段的序列化。

 @OneToMany(mappedBy="manager") @JsonIgnore private Set employees; 

2) @JsonView可以将关系的一部分隐藏为内部视图(但如果您将使用Internal视图编写JSON对象,则会出现):

 @OneToMany(mappedBy="manager") @JsonView(Views.Internal.class) private Set employees; @ManyToOne(cascade={CascadeType.ALL}) @JoinColumn(name = "DepartmentID") @JsonView(Views.Public.class) private Department department; 

3) 使用自定义序列化器,您可以自己确定构建JSON对象的规则。

4)在类上使用@JsonIdentityInfo (表示该类型的属性应该启用了function)以及单个属性(支持不能注释类型本身的情况;或者使用不同的id生成序列)。

示例1 @JsonIdentityInfo

示例2 @JsonIdentityInfo