스프링-부트가 1 대 다 연관된 무한 루프
저는 휴식 어플에서 jpa와 함께 스프링부츠를 사용합니다.
하숙인 수업이 있습니다.
가지고 있는 사람
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lodger")
private List<Reference> referenceList;
제 수업시간에 저는 참고로
@ManyToOne
@JoinColumn(name = "lodgerId")
private Lodger lodger;
내가 이 방법을 부를 때
@RequestMapping(value = "/lodgers/{lodgerId}", method = RequestMethod.GET)
public Lodger getLogderById(@PathVariable("lodgerId") long lodgerId) {
return lodgerService.getLodger(lodgerId);
}
이 오류가 발생합니다.
org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: server.bean.Lodger["referenceList"]->org.hibernate.collection.internal.PersistentBag[0]->server.bean.Reference["lodger"]->server.bean.Lodger["referenceList"]->org.hibernate.collection.internal.PersistentBag[0]->server.bean.Reference["lodger"]->server.bean.Lodger["referenceList"]...
해결책:
사용하다
@JsonManagedReference
인스턴스화된 첫 번째 개체에 대한 주석
@JsonBackReference
인스턴스화된 두 번째 개체에 대한 주석
첫번째:
@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lodger")
private List<Reference> referenceList;
두번째:
@JsonBackReference
@ManyToOne
@JoinColumn(name = "lodgerId")
private Lodger lodger;
반환 개체에 사이클이 있고 스프링이 다른 유형으로 사이클을 직렬화하려고 할 때 발생합니다.
반환된 모델에서 사이클 없이 DTO 또는 Value Object(단순 POJO)를 생성한 후 반환합니다.
두 테이블의 기본 키가 동일한 경우(예: id).
추가하기
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class User {
...
}
그리고 레퍼런스 클래스로.
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class Reference {
...
}
당신이 필요로 하는 것은, 당신의 반에서 당신이 주석을 가지고 있는 것입니다.@ManyToOne
, 값 섹션에서 건너뛸 속성을 사용하여 다음 주석 구현@JsonIgnoreProperties(value = {"yourAttribute", "handler", "hibernateLazyInitializer"}, allowSetters = true)
당신의 코드에 대한 예를 들었습니다 ->
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnoreProperties(value = {"referenceList", "handler","hibernateLazyInitializer"}, allowSetters = true)
@JoinColumn(name = "lodgerId")
private Lodger lodger;
의 값 섹션에 입력하는 모든 특성@JsonIgnoreProperties
는 무시되며, 이를 통해 무한 루프를 해결하고 향후 동일한 형식으로 다른 개발에 사용할 수 있습니다.
REST 웹 서비스를 통해 순환 종속성이 있는 엔티티를 반환하지 않음 - 새 DTO 클래스를 생성하고 데이터베이스에서 가져온 엔티티를 매핑하여 웹 서비스로 반환합니다.
자세한 정보는 여기: http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application
물론 당신이 원한다면 다른 지도 라이브러리를 사용해도 좋습니다, 제 개인적으로 가장 좋아하는 것은 Orika (http://orika-mapper.github.io/orika-docs/intro.html) 입니다.
코드가 아래와 같다고 가정해 보겠습니다.
Lodger.class
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lodger")
private List<Reference> referenceList;
public List<Reference> getReferenceList() {
return referenceList;
}
public void setReferenceList(List<Reference> referenceList) {
this.referenceList = referenceList;
}
@Override
public String toString() {
return "Lodger[referenceList=" + referenceList + "]";
}
참조.클래스
@ManyToOne
@JoinColumn(name = "lodgerId")
private Lodger lodger;
public Lodger getLodger() {
return lodger;
}
public void setLodger(Lodger lodger) {
this.lodger = lodger;
}
@Override
public String toString() {
return "Reference[lodger=" + lodger + "]";
}
두 POJO 모두에 기록된 toString() 메서드에서 우리가 양쪽 클래스의 String()으로 호출하는 것을 알 수 있으며, 이로 인해 두 클래스 모두에서 String() 메서드로 호출이 무한히 발생하며 이는 종료되지 않습니다.이러한 상황을 방지하려면 Reference.class의 String() 참조를 제거합니다.Lodger 클래스에서도 삭제할 수 있습니다.]참조 클래스의 ToString()에는 로더 속성이 없습니다.
마지막으로 Reference 클래스는 다음과 같이 나타납니다.
참조.클래스
@ManyToOne
@JoinColumn(name = "lodgerId")
private Lodger lodger;
public Lodger getLodger() {
return lodger;
}
public void setLodger(Lodger lodger) {
this.lodger = lodger;
}
@Override
public String toString() {
return "Reference[Properties other than lodger=" + properties other than lodger + "]";
}
@JsonIgnoreProperties({"hibernateLazyInitializer","referenceList"}) at class Level
참고로 medium.com 의 이 기사를 참조하십시오.
언급URL : https://stackoverflow.com/questions/30892298/infinite-loop-with-spring-boot-in-a-one-to-many-relation
'it-source' 카테고리의 다른 글
jQuery, 단순 폴링 예제 (0) | 2023.09.13 |
---|---|
JAXB: XML 문서를 삭제하지 않는 동안 네임스페이스를 무시하는 방법은 무엇입니까? (0) | 2023.09.13 |
캐럿(^) 문자는 Git에서 무엇을 의미합니까? (0) | 2023.09.13 |
설명 계획에서 비용, 카디널리티 및 바이트의 의미는 무엇입니까? (0) | 2023.09.13 |
파워셸 출력 숨기기 (0) | 2023.09.13 |