it-source

스프링-부트가 1 대 다 연관된 무한 루프

criticalcode 2023. 9. 13. 22:40
반응형

스프링-부트가 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 의 이 기사를 참조하십시오.

enter image description here

언급URL : https://stackoverflow.com/questions/30892298/infinite-loop-with-spring-boot-in-a-one-to-many-relation

반응형