2015-06-17 3 views
3

В приложении для отдыха я использую весенний ботинок с jpa.Бесконечная петля с пружинным ботинком в отношениях один-много

У меня есть класс Lodger

, которые имеют

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lodger") 
private List<Reference> referenceList; 

В моем классе Reference, у меня есть

@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"]... 
+1

Вы найдете лучшее решение для этого здесь https://stackoverflow.com/questions/37392733/difference-between-jsonignore-and-jsonbackreference-jsonmanagedreference/37394318 – xJPx

ответ

2

Это происходит, когда у вас есть цикл в обратном объекте, а весна пытается сериализовать его на другой тип.

Попробуйте создать объект DTO или объект Value (простой POJO) без циклов из возвращенной модели и затем вернуть его.

0

Не возвращайте сущность с круговыми зависимостями через веб-сервис REST - создайте новый класс DTO, выведите объекты, полученные из базы данных, и верните их в webservice.

Больше информации здесь: http://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

Конечно, если вы хотите, вы можете использовать другую библиотеку отображения, мой личный фаворит Orika (http://orika-mapper.github.io/orika-docs/intro.html)

0

Давайте предположим, что ваш код выглядит следующим образом: -

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 + "]"; 
} 

Reference.class

@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 + "]"; 
} 

Когда вы замечаете метод toString(), написанный как в POJO, вы увидите, что мы вызываем toString() обоих классов с обеих сторон, что приводит к бесконечному no. вызовов toString() с обеих сторон, которые никогда не заканчиваются. Чтобы избежать этой ситуации, удалите любую ссылку из toString() в Refernce.class [Вы также можете удалить из класса Lodger.] Таким образом, класс toString() класса Reference не будет иметь свойство lodger.

Так, наконец, ваш класс Ссылка будет выглядеть так: -

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 + "]"; 
} 
+0

Пожалуйста, комментарий, если вы еще не получили решение. –

3

Решение:

Использование

@JsonManagedReference аннотаций для первых объектов экземпляра

@JsonBackReference аннотаций для вторых объектов экземпляра

Первый:

@JsonManagedReference 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "lodger") 
    private List<Reference> referenceList; 

Второе:

@JsonBackReference 
@ManyToOne 
    @JoinColumn(name = "lodgerId") 
    private Lodger lodger; 
Смежные вопросы