Я пытаюсь установить отношения родитель-потомок между некоторыми объектами, и у меня возникли некоторые проблемы.
В моем случае я пытаюсь хранить объекты внутри других объектов (например, контейнер хранит несколько элементов или другие контейнеры с элементами). Сложность состоит в том, что каждый объект в хранилище должен иметь возможность определить, какой он является внешним родительским объектом. Хотя это, кажется, работает в моей базе данных в памяти (в настоящее время используется h2), попытка получить JSON представление всех моих элементов хранения дает это (я возвращаю List<StorageUnit>
):
Не удалось записать JSON: бесконечная рекурсия (StackOverflowError); вложенное исключение: com.faster xml .jackson.databind.JsonMappingException: бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: java .util.ArrayList [0] -> com.warehousing.storage.FixedContentsCase ["contents"] -> java .util.ArrayList [0] -> com.warehousing.storage.FixedContentsCase ["contents"] -> ...
Вот классы:
StorageUnit
@Entity
@Inheritance
public abstract class StorageUnit {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Location location;
protected Long parentContainerId;
// <getters & setters>
public abstract List<StorageUnit> getContents();
}
FixedContentCase
@Entity
public class FixedContentsCase extends StorageUnit {
@OneToMany
private List<Item> items;
public FixedContentsCase() {
super();
items = new ArrayList<>();
}
// <getters & setters>
@Override
public List<StorageUnit> getContents() {
// Return the case itself and its contents
List<StorageUnit> contents = new ArrayList<>(Arrays.asList(this));
for (StorageUnit item : items)
contents.addAll(item.getContents());
return contents;
}
}
Элемент
@Entity
public class Item extends StorageUnit {
private String description;
public Item() {
super();
this.description = "";
}
// <getters & setters>
@Override
public List<StorageUnit> getContents() {
return Arrays.asList(this);
}
}
I Я пытался аннотировать класс StorageUnit
с помощью @JsonIgnoreProperties("parentContainerId")
, но это не сработало. Аннотации parentContainerId
с @JsonIgnore
тоже не помогли. Я также попытался аннотировать геттеры вместо самих атрибутов (согласно * 1031) * follow ). Есть ли способ обойти это или необходимо какое-то изменение дизайна? Спасибо!