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

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

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

ObjectMapper objectMapper = new ObjectMapper();

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

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

введите здесь описание изображения

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

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

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


person suat    schedule 02.05.2018    source источник
comment
не могли бы вы показать класс, который вы сериализуете. Потому что для меня оба они сериализуют только публичные поля.   -  person Ruslan Akhundov    schedule 02.05.2018
comment
@RuslanAkhundov только что обновил пост   -  person suat    schedule 02.05.2018
comment
Spring Boot документы поясните, что стандартный преобразователь Jackson, предоставляемый Spring, имеет некоторые настраиваемые свойства из коробки. Можете ли вы сузить его до этих различий?   -  person JellyRaptor    schedule 02.05.2018
comment
Да, функция DEFAULT_VIEW_INCLUSION была разной в обеих настройках. Но у меня все еще есть разные результаты даже после его включения. Пожалуйста, смотрите мое редактирование.   -  person suat    schedule 02.05.2018


Ответы (2)


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

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

person suat    schedule 03.05.2018

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

person Karol Dowbecki    schedule 02.05.2018