복붙노트

[SPRING] 자기 참조 클래스를 가진 Java Hibernate json 무한 재귀

SPRING

자기 참조 클래스를 가진 Java Hibernate json 무한 재귀

종업원 :

@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<Employee> 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.<init>(Unknown Source)
at java.nio.HeapCharBuffer.<init>(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. ==============================

    1.귀하의 요구 사항에 따라 다양한 옵션이 있습니다.

    귀하의 요구 사항에 따라 다양한 옵션이 있습니다.

    1) @JsonIgnore는 필드 직렬화를 피하는 데 사용할 수 있습니다.

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

    2) @JsonView는 관계의 한 부분을 내부보기로 숨길 수 있습니다 (내부보기가있는 JSON 객체를 작성하는 경우 나타납니다).

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

    3) 커스텀 시리얼 라이저를 사용하여 JSON 객체를 직접 빌드하는 규칙을 결정할 수 있습니다.

    4) 클래스에서 @JsonIdentityInfo를 사용하여 (해당 유형의 특성에 기능이 사용 가능해야 함을 나타냄) 개별 특성 (유형 자체에 주석을 달 수없는 경우 지원 또는 다른 ID 생성 순서 사용)을 사용하십시오.

    예 1 @JsonIdentityInfo

    예 2 @JsonIdentityInfo

  2. from https://stackoverflow.com/questions/45362300/java-hibernate-json-infinite-recursion-with-self-referencing-class by cc-by-sa and MIT license