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

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

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

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

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

Заголовок контроллера:

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

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

Ответ 1

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

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

Здесь вы можете проверить примеры .

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

UPDATE

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

Ответ 2

Единственная аннотация @JsonIdentityInfo решает проблему. Он также обрабатывает круговые ссылки. Ссылка