Короче говоря, у одной из моих сущностей есть GeometryCollection, которая генерирует исключение, когда вы вызываете getBoundary (почему это другая книга, а пока давайте предположим, что это работает именно так).
Есть ли способ сказать Джексону не включать этот конкретный получатель? Я знаю, что могу использовать @JacksonIgnore, когда владею / контролирую код. Но это не тот случай, Джексон достигает этой точки путем непрерывной сериализации родительских объектов. Я видел опцию фильтрации в документации Джексона. Это правдоподобное решение?
Спасибо!
objectMapper.addMixInAnnotations(Class<?> target, Class<?> mixinSource);
Еще одна возможность: если вы хотите игнорировать все неизвестные свойства, вы можете настроить преобразователь следующим образом:
источник
mapper.configure(DeserializationFeature.failOnUnknownPropertiesExcep(new String[] {"myField"}));
without()
:mapper.reader().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
Использование класса Java
Использование аннотации
источник
Аннотационный подход лучше. Но иногда требуется ручное управление. Для этого вы можете использовать без метода ObjectWriter .
источник
Как уже упоминалось, здесь очень хорошо работают смешанные аннотации. Другая возможность, выходящая за рамки свойства @JsonIgnore, - использовать @JsonIgnoreType, если у вас есть тип, который никогда не должен включаться (т.е. если все экземпляры свойств GeometryCollection должны игнорироваться). Затем вы можете либо добавить его напрямую (если вы контролируете тип), либо с помощью смешивания, например:
Это может быть более удобно, если у вас есть много классов, у которых есть один метод доступа IgnoredType getContext () или около того (что характерно для многих фреймворков).
источник
У меня была аналогичная проблема, но она была связана с двунаправленными отношениями Hibernate. Я хотел показать одну сторону отношений и программно игнорировать другую, в зависимости от того, с какой точкой зрения я имел дело. Если вы не можете этого сделать, вы получите неприятные
StackOverflowException
s. Например, если бы у меня были эти предметыЯ бы хотел программно игнорировать
parent
поле в B, если бы я смотрел на A, и игнорироватьchildren
поле в A, если бы я смотрел на B.Я начал использовать миксины для этого, но это очень быстро становится ужасным; у вас есть так много бесполезных классов, которые существуют исключительно для форматирования данных. В итоге я написал свой собственный сериализатор, чтобы упростить эту задачу: https://github.com/monitorjbl/json-view .
Он позволяет программно указать, какие поля игнорировать:
Он также позволяет легко указывать очень упрощенные представления с помощью сопоставителей подстановочных знаков:
В моем первоначальном случае потребность в простых представлениях, подобных этому, заключалась в том, чтобы показать самый минимум о родителе / потомке, но это также стало полезным для нашей ролевой безопасности. Менее привилегированные представления объектов должны возвращать меньше информации об объекте.
Все это исходит от сериализатора, но я использовал Spring MVC в своем приложении. Чтобы заставить его правильно обрабатывать эти случаи, я написал интеграцию, которую вы можете добавить к существующим классам контроллеров Spring:
Оба доступны на Maven Central. Я надеюсь, что это поможет кому-то еще, это особенно неприятная проблема с Джексоном, у которой не было хорошего решения для моего случая.
источник
Match.match()
?Если вы хотите ВСЕГДА исключать определенные свойства для любого класса, вы можете использовать
setMixInResolver
метод:источник
Еще один хороший момент - использовать
@JsonFilter
. Некоторые подробности здесь http://wiki.fasterxml.com/JacksonFeatureJsonFilterисточник