Два объекта Jackson ObjectMapper генерируют разные сериализации

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

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

ObjectMapper objectMapper = new ObjectMapper();

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

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

Два объекта Jackson ObjectMapper генерируют разные сериализации

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

  • Порядок сериализованных полей
  • Сериализация защищенных переходных полей. (Экземпляр с автоматическим подключением вообще не сериализует их.)
  • Различия в регистре в сериализованных полях, то есть первое генерирует "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

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

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

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

Ruslan Akhundov 02.05.2018 18:11

@RuslanAkhundov только что обновил пост

suat 02.05.2018 18:26

Spring Boot документы проясняет, что средство сопоставления Джексона по умолчанию, предоставляемое Spring, имеет некоторые настраиваемые свойства из коробки. Можете ли вы сузить круг этих различий?

JellyRaptor 02.05.2018 18:28

Да, функция DEFAULT_VIEW_INCLUSION отличалась в обеих настройках. Но даже после включения у меня все еще разные результаты. Пожалуйста, посмотрите мою правку.

suat 02.05.2018 19:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
414
2

Ответы 2

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

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

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

Другие вопросы по теме