Как решить циклическую ссылку в json сериализаторе, вызванную двунаправленным отображением гибернации? - PullRequest
74 голосов
/ 27 июля 2010

Я пишу сериализатор для сериализации POJO в JSON, но застрял в циклической ссылке.В спящем двунаправленном отношении «один ко многим» родительские ссылки дочерние и дочерние ссылки возвращаются к родителю, и здесь мой сериализатор умирает.(см. пример кода ниже)
Как разорвать этот цикл?Можем ли мы получить дерево владельцев объекта, чтобы увидеть, существует ли сам объект где-то в его собственной иерархии владельцев?Любой другой способ узнать, будет ли ссылка круговой?или любая другая идея, чтобы решить эту проблему?

Ответы [ 12 ]

0 голосов
/ 20 ноября 2015

ответ номер 8 тем лучше, я думаю, так что, если вы знаете, в каком поле выдается ошибка, вы только устанавливаете поле в null и решаете.

List<RequestMessage> requestMessages = lazyLoadPaginated(first, pageSize, sortField, sortOrder, filters, joinWith);
    for (RequestMessage requestMessage : requestMessages) {
        Hibernate.initialize(requestMessage.getService());
        Hibernate.initialize(requestMessage.getService().getGroupService());
        Hibernate.initialize(requestMessage.getRequestMessageProfessionals());
        for (RequestMessageProfessional rmp : requestMessage.getRequestMessageProfessionals()) {
            Hibernate.initialize(rmp.getProfessional());
            rmp.setRequestMessage(null); // **
        }
    }

Чтобы сделать код читабельным, большой комментарий перемещается из комментария // ** в нижнее.

java.lang.StackOverflowError [Ошибка обработки запроса;Вложенное исключение - org.springframework.http.converter.HttpMessageNotWritableException: не удалось записать JSON: бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: com.service.pegazo.bo.RequestMessageProfessional ["requestMessage.o.serg.bo.RequestMessage ["requestMessageProfessionals"]

0 голосов
/ 10 февраля 2011

Например, у ProductBean есть serialBean.Отображение будет двунаправленным отношением.Если мы сейчас попытаемся использовать gson.toJson(), то получится циклическая ссылка.Чтобы избежать этой проблемы, вы можете выполнить следующие действия:

  1. Получить результаты из источника данных.
  2. Выполните итерацию списка и убедитесь, что serialBean не равен NULL, а затем
  3. Set productBean.serialBean.productBean = null;
  4. Затем попробуйте использовать gson.toJson();

Это должно решить проблему

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