Json и Java – Циркулярная ссылка

У меня есть и проблема с Циркулярной ссылкой.

У меня есть Rest Webservices, который возвращает объекты в front-end, проблема в том, что я пытаюсь вернуть объекты, которые имеют несколько ссылок, поэтому в результате я получаю бесконечный ответ, который генерирует

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 

Объекты генерируются автоматически с помощью Hibernate Code Generation, и мне нужно иметь круговую ссылку в бэкэнд, мне просто нужно удалить ее перед отправкой информации в интерфейс с помощью Jackson.

Заголовок controllerа:

 @RequestMapping(value="/list", method=RequestMethod.POST) public @ResponseBody eventResponse list(@RequestBody String sessionID) { 

Я ничего не делаю, чтобы преобразовать в Json, я новичок с этим, и я думаю, что jackson решил это автоматически.

Это можно сделать двумя способами. Если вы должны подвергнуть свою сущность внешнему миру, я рекомендую добавить @JsonIgnore в свойство, вызывающее циклическую ссылку. Это скажет jacksonу не сериализовать это свойство.

Другой способ – использовать двунаправленные функции, предоставляемые Jackson. Вы можете использовать @JsonManagedReference или @JsonBackReference . @JsonManagedReference – это «форвардная» часть свойства, и она будет нормально сериализована. @JsonBackReference – это «обратная» часть ссылки; он не будет сериализован, но будет реконструирован, когда дескриптор «вперед» будет десериализован.

Здесь вы можете ознакомиться с примерами.

Это касается вашего комментария: я думаю, что вы, возможно, захотите сделать в этом случае, – это использовать DTO, видимый внешнему миру. Мне нравится этот подход, потому что я не хочу раскрывать свои сущности снаружи. Это означает, что annotations jacksonа будут на DTO, а не на enity. Вам понадобится какой-то картограф или конвертер, который преобразует сущность в DTO. Теперь, когда вы вносите изменения в свою сущность, они не будут распространяться в DTO, если вы не измените свой конвертер / конвертер. Я думаю, это нормально, потому что, когда вы вносите изменения в свою сущность, вы можете решить, хотите ли вы, чтобы это изменение было открыто или нет.

ОБНОВИТЬ

Здесь есть хороший блог, в котором подробно рассказывается о различных способах обработки двунаправленных отношений в jacksonе. В нем описываются решения, которые используют @JsonIgnore , @JsonManagedReference и @JsonBackReference , @JsonIdentityInfo , @JsonView и собственный сериализатор. Это довольно полная запись различных методов, которые вы можете использовать.

Проблема @JsonIdentityInfo одной annotations @JsonIdentityInfo . Он также обрабатывает круговые ссылки. Справка

  • что такое возвращаемый тип оператора присваивания?
  • C ++ 11 auto: что, если он получает постоянную ссылку?
  • C ++: ссылка const, перед vs после спецификатора типа
  • О привязке ссылки const к под-объекту временного
  • Установить пользовательский путь к ссылочным DLL?
  • Разница между константой const и нормальным параметром
  • Возrotation временного объекта и привязка к константной ссылке
  • Постоянный ресурс ссылки C ++ (контейнерный адаптер)
  • Java, pass-by-value, ссылочные переменные
  • Что такое «корневая ссылка»?
  • Как получить доступ к переменной из другого скрипта в другом игровом объекте через GetComponent?
  • Давайте будем гением компьютера.