Джексон: JsonBackReference - бесконечная проблема рекурсии - PullRequest
0 голосов
/ 16 января 2019

Мои знания в 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

таблица автора содержит монобольную ссылку на книгу.

Спасибо

1 Ответ

0 голосов
/ 16 января 2019

Похоже, ваши аннотации не в том месте.

Почему Library имеет ManagedReference для книг, когда вы предотвращаете рекурсию между Author и Book?

Вероятно, так и должно быть:

public class Author {
    @JsonBackReference
    private Book book;
}

public class Book {
    @JsonManagedReference
    private List<Author> authors = new ArrayList<Author>();
}

Более того, определенно существует неправильная модель, согласно которой Author имеет непосредственное отношение к книге. Логически Author может владеть многими books.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...