Пользовательская сериализация Джексона в библиотеке

Я пишу загрузочное приложение Spring, которое использует RestController для предоставления одного ресурса. Единственный ресурс, MainResource, выглядит примерно так:

String id; String title; List<String> tags; ComplexGraphObject gObject;

Чтобы это работало, я написал DTO для MainResource и для gObject и его полей, где это необходимо. Я аннотировал DTO с помощью Джексона и написал DTO-Mappers, которые возвращают модели предметной области. Spring правильно сериализует запросы к DTO, а служба приложений вызывает DTO-Mappers для объектов домена.

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

Мои цели:

  1. Библиотека должна принимать сериализованные объекты gObject в формате json/xml и возвращать объекты домена.
  2. Библиотека должна принимать gObjects домена и возвращать сериализованные json/xml.
  3. Включите приложения, которые уже используют Jackson, для максимально эффективной работы с библиотекой, такой как Spring Boot, например.
  4. Предоставьте удобные методы для других приложений, которые могут использовать, например, что-то вроде gson.

Из того, что я читал, можно использовать специальный jackson de/serializer. Но между пользовательскими сериализаторами, ObjectMapper, MixIns и т. д. я не знаю, как это сделать.

РЕДАКТИРОВАТЬ: я думаю, что цель миксинов - это то, что делают мои DTO, а DTO-Mapper делает то, что должен делать пользовательский де/сериализатор. Есть ли способ смешать два?

РЕДАКТИРОВАТЬ: Важная часть, которую я забыл. DTO-Mapper генерирует объекты домена из DTO, а также матрицу, которая представляет необходимые отношения для каждого узла в графе, чтобы их можно было соединить соответствующим образом. Итак, я думаю, мне нужно сделать это в пользовательском сериализаторе?


person jam01    schedule 09.04.2017    source источник


Ответы (1)


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

Если вы измените конфигурацию ObjectMapper, пользователи вашей библиотеки должны будут сделать то же самое. Вы можете реализовать модуль Джексона:

@Component
public class DateTimeModule extends SimpleModule {

public DateTimeModule() {
    super(DateTimeModule.class.getName(), Version.unknownVersion());
    //do whatever you need here....
    addSerializer(DateTime.class, new DateTimeSerializer());
    addDeserializer( DateTime.class, new DateTimeDeserializer(DateTime.class));
}
}

Пользователь вашей библиотеки должен зарегистрировать модуль в ObjectMapper с помощью

  • ObjectMapper#findAndRegisterModules
  • ObjectMapper#registerModules

Есть разные способы сделать это весной, см. этот пост

Миксины Джексона позволяют использовать аннотации сериализации для классов, которые вы не можете изменять. Если вы используете миксины, вам необходимо настроить их в модуле.

Если вы используете пользовательский сериализатор, вам необходимо настроить их в модуле, как показано в примере.

Сериализация графа звучит как вариант использования пользовательского сериализатора.

person Stefan Isele - prefabware.com    schedule 09.04.2017
comment
Спасибо за ответ. Я думаю, что это то направление, в котором я двигаюсь, так что вы укрепляете мой подход. Проблема, которую я вижу, заключается в генерации XML, насколько я могу судить, аннотации — единственный способ установить такие вещи, как атрибуты. Я полагаю, мне где-то понадобятся миксины... - person jam01; 09.04.2017