[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) @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
from https://stackoverflow.com/questions/45362300/java-hibernate-json-infinite-recursion-with-self-referencing-class by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 보안을 사용하여 비밀번호 변경하기 (0) | 2019.02.21 |
---|---|
[SPRING] Spring, Hibernate Lazy Loading, sessionFactory 및 OpenSessionInViewFilter (0) | 2019.02.21 |
[SPRING] Spring 컨텍스트에서 기본 경로로 시스템 속성에서 속성 파일로드 (0) | 2019.02.21 |
[SPRING] Spring이 applicationContext.xml에 정의되지 않은 Struts 액션에서 속성을 주입하는 방법 (0) | 2019.02.21 |
[SPRING] tx : annotation-driven에서 Custom AnnotationTransactionAttributeSource 사용하기 (0) | 2019.02.21 |