Два Джексона ObjectMapper генерируют разные сериализации - PullRequest
0 голосов
/ 02 мая 2018

У меня есть два экземпляра ObjectMapper Джексона. (С использованием v2.8.3)

Первый экземпляр создается следующим образом:

ObjectMapper objectMapper = new ObjectMapper();

Другой автоматически подключается из контекста Spring Boot через @Autowired.

Обе имеют одинаковые конфигурации видимости, подобные этой:

enter image description here

Но они производят разные сериализации для одного и того же объекта. Различия, которые я понял, заключаются в следующем:

  • Порядок сериализованных полей
  • Сериализация защищенных переходных полей. (Экземпляр с автопроводкой вообще не сериализует их.)
  • Различия в регистре в сериализованных полях, то есть в первом генерируется «MonitoringUserID», а во втором - «MonitoringUserID».

То, что я хочу, это то, что автоматически проводной преобразователь также сериализует защищенные переходные поля.

Я также был бы рад, если вы сообщите мне причины других различий в обеих сериализациях.

Упрощенная версия сериализуемого примера класса:

public class ClauseType implements Serializable {
    protected transient List<ClauseTypeNoteItem> noteItems;

    public ClauseType() {
    }

    public List<ClauseTypeNoteItem> getNoteItems() {
        ...
    }

    public void setNoteItems(List<ClauseTypeNoteItem> value) {
        ...
    }
}

Полный класс ClauseType: https://pastebin.com/m3h1hesn

Завершить класс ClauseTypeNoteItem: https://pastebin.com/dmphNV4e

Edit: Я понял, что оба экземпляра имеют функции отображения различий. Согласно документам, после включения функции DEFAULT_VIEW_INCLUSION экземпляра с автопроводкой у них были те же функции сопоставления, что и у 1068991. Однако различия все еще сохраняются. Я также понял, что в автопроводном маппере есть два зарегистрированных модуля: org.springframework.boot.jackson.JsonComponentModule и com.fasterxml.jackson.datatype.joda.JodaModule. Я не уверен, влияет ли второй модуль на результаты, которые я получаю.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Оказалось, что Spring вводит JaxbAnnotationIntrospector из jackson-module-jaxb-annotations зависимости maven. Во время создания экземпляров BeanDescription s интроспектор Jaxb переопределяет предоставленные мной настройки проверки видимости. Итак, в качестве решения я добавлю новый бин ObjectMapper и обозначу его как @Primary.

Если вы думаете о каком-либо другом лучшем решении, дайте мне знать

0 голосов
/ 02 мая 2018

В Spring Boot Jackson ObjectMapper создается и настраивается объектом Jackson2ObjectMapperBuilder. Основным источником конфигурации являются свойства spring.jackson.*, описанные в документации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...