У меня есть два экземпляра Джексона ObjectMapper. (Используя v2.8.3)
Первый экземпляр создается следующим образом:
ObjectMapper objectMapper = new ObjectMapper();
Другой автоматически подключается из контекста загрузки Spring через @Autowired.
Оба имеют одинаковые конфигурации видимости, например:
Но они производят разные сериализации для одного и того же объекта. Я понял следующие различия:
Я хочу, чтобы автоматическое преобразование также сериализовало защищенные переходные поля.
Я также буду рад, если вы расскажете мне о причинах других различий в обеих сериализациях.
Упрощенная версия сериализуемого примера класса:
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. Я не уверен, влияет ли второй модуль на получаемые мной результаты.
Заранее спасибо.
@RuslanAkhundov только что обновил пост
Spring Boot документы проясняет, что средство сопоставления Джексона по умолчанию, предоставляемое Spring, имеет некоторые настраиваемые свойства из коробки. Можете ли вы сузить круг этих различий?
Да, функция DEFAULT_VIEW_INCLUSION отличалась в обеих настройках. Но даже после включения у меня все еще разные результаты. Пожалуйста, посмотрите мою правку.




В Spring Boot Jackson ObjectMapper собирается и настраивается объектом Jackson2ObjectMapperBuilder. Основным источником конфигурации являются свойства spring.jackson.*, как описано в документации:
Оказалось, что Spring вводит JaxbAnnotationIntrospector из зависимости от maven jackson-module-jaxb-annotations. Во время создания экземпляров BeanDescription интроспектор Jaxb переопределяет настройки средства проверки видимости, которые я предоставил. Итак, в качестве решения я вставлю новый bean-компонент ObjectMapper и помечу его как @Primary.
Если вы думаете о другом лучшем решении, дайте мне знать
не могли бы вы показать класс, который вы сериализуете. Потому что для меня они оба сериализуют только общедоступные поля.