Ответ 1
Есть два способа обойти это. Если вы должны подвергнуть свою сущность внешнему миру, я рекомендую добавить @JsonIgnore
в свойство, вызывающее циклическую ссылку. Это скажет Джексону не сериализовать это свойство.
Другой способ - использовать двунаправленные функции, предоставляемые Jackson. Вы можете использовать @JsonManagedReference
или @JsonBackReference
. @JsonManagedReference
- это "форвардная" часть свойства, и она будет сериализована в обычном режиме. @JsonBackReference
является "обратной" частью ссылки; он не будет сериализован, но будет восстановлен, когда дескриптор "вперед" будет десериализован.
Здесь вы можете проверить примеры .
В этом выражается ваш комментарий: я думаю, что вы можете сделать в этом случае использование DTO, видимого для внешнего мира. Мне нравится этот подход, потому что я не хочу раскрывать свои сущности снаружи. Это означает, что аннотации Джексона будут на DTO, а не на enity. Вам понадобится какой-то картограф или конвертер, который преобразует сущность в DTO. Теперь, когда вы вносите изменения в свою сущность, они не будут распространяться в DTO, если вы не измените свой конвертер/конвертер. Я думаю, это нормально, потому что, когда вы вносите изменения в свою сущность, вы можете решить, хотите ли вы, чтобы это изменение было открыто или нет.
UPDATE
Существует хорошее сообщение в блоге здесь, в котором подробно рассказывается о различных способах обработки двунаправленных отношений в Джексоне. В нем описываются решения, которые используют @JsonIgnore
, @JsonManagedReference
и @JsonBackReference
, @JsonIdentityInfo
, @JsonView
и собственный сериализатор. Это довольно полная запись различных методов, которые вы можете использовать.