Мои знания в JSON ограничены, так что, надеюсь, вы сможете указать мне верное направление.
Я пытаюсь опубликовать объект (библиотеку), но это вызывает исключение из-за бесконечной рекурсии
public class Library{
private List<Book> books= new
ArrayList<Book>();
//omitting rest of attributes, constructor,
and getter/setters
}
public class Book{
private List<Author> authors= new
ArrayList<Author>();
//omitting rest of attributes, constructor,
and getter/setters
}
public class Author{
private Book book;
//omitting rest of attributes, constructor,
and getter/setters
}
Как видите, это приводит к бесконечной рекурсии, которую невозможно сериализовать:
Library -> Book -> Author -> Book -> Author...
Это плохо спроектировано, но у меня нет возможности сменить модель.
Я пытался решить эту проблему, используя JsonManagedReference
и JsonBackReference
.
public class Library{
@JsonManagedReference(value="book")
private List<Book> books= new
ArrayList<Book>();
//omitting rest of attributes, constructor,
and getter/setters
}
public class Author{
@JsonBackReference(value="book")
private Book book;
//omitting rest of attributes, constructor,
and getter/setters
}
Однако это не работает, и я получаю сообщение об ошибке:
Причина: java.lang.IllegalArgumentException: не может обработать
управляемая / обратная ссылка 'book': свойство обратной ссылки не найдено из
тип [тип коллекции; класс java.util.List, содержит [простой тип,
класс ....... модель.Книга]]
Я могу сериализовать объект, если удаляю аннотацию @JsonManagedReference
и оставляю BackReference
. Однако сериализованный объект устанавливает Book
экземпляр в Author
на ноль, что приводит к исключительной ситуации при попытке сохранить это в базе данных.
Размещаю ли я свои аннотации в нужном месте? Есть предложения?
Редактировать: Как указывалось в ответах, мои комментарии были неправильно размещены. Следующее работает для сериализации объекта, но Автор теряет ссылку на Книгу
public class Book{
@JsonManagedReference
private List<Author> authors= new
ArrayList<Author>();
}
public class Author{
@JsonBackReference
private Book book;
}
Это решает проблему бесконечной рекурсии. Однако я получаю исключение SQL, поскольку не могу вставить нулевое значение.
Library -> Book -> Author X Book
таблица автора содержит монобольную ссылку на книгу.
Спасибо