#java #spring_mvc
Есть 2 pojo класса: public class Component { private String ID; private SetenvironmentSet; public class Environment { private String host; private String name; private Set components; И контейнер для второго: public class EnvironmentContainer { private List allEnvironments; Мне по данному пути нужно вернуть лист из контейнера @RequestMapping("/environments") @ResponseBody public List getAllEnvironments() { return environmentcontainer.getAllEnvironments(); } При выполнении возникает ошибка, скорее всего из за взаимосвязи между pojo, построенной на set: java.lang.IllegalStateException: Cannot call sendError() after the response has been committed at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:466) Слышал в спринге есть аннотация, которая обрубает бесконечное извлечение, или есть другие пути как это исправить?
Ответы
Ответ 1
Нижеизложенное справедливо если вы используете Jackson для сериализации ваших бинов. В Jackson есть аннотации, позволяющие управлять сериализацией бинов, связанных циклическими ссылками. Это @JsonManagedReference и @JsonBackReference. Первой помечается поле или геттер основного класса (с которого начинается сериализация) со ссылками на зависимые объекты, второй - поле или геттер зависимого класса со ссылкой на основной: public class Environment { @JsonManagedReference private Setcomponents; } public class Component { @JsonBackReference private Set environmentSet; } Теперь Jackson не уйдёт в бесконечную рекурсию при сериализации. Другая аннотация, которая может помочь - @JsonIgnore. Поля, помеченные такой аннотацией, не включаются в сериализованный объект. Если объекты класса Component никогда не будут сериализовываться отдельно от объектов Environment, то можно пометить поле environmentSet аннотацией @JsonIgnore, эффект будет аналогичный. Ещё один вариант - @JsonIdentityInfo. Этой аннотацией помечается весь класс. С её помощью можно подсказать Jackson'у, как определить уникальный ключ объекта (например, по полю ID): @JsonIdentityInfo( generator = ObjectIdGenerators.PropertyGenerator.class, property = "ID") public class Environment { ... } Встретив при сериализации объект с ключом, который он уже обрабатывал, Jackson подставит вместо него его ключ. Также есть возможность управлять сериализацией циклических ссылок через @JsonView (подробнее об этом и других способах читайте в этой статье), но это требует регистрации в Spring'е кастомного сериализатора.
Комментариев нет:
Отправить комментарий