Рубрики
Без рубрики

Как настроить сериализатор JSON, используемый типами гибернации

В этой статье вы увидите, как настроить сериализатор JSON с помощью типов гибернации. Это позволит вам изменить поведение внутреннего метода клонирования.

Автор оригинала: Vlad Mihalcea.

Вступление

Как уже объяснялось , проект типы гибернации с открытым исходным кодом позволяет сопоставлять типы перечислений JSON, МАССИВОВ, PostgreSQL и предоставляет простой способ добавления неизменяемых типов гибернации.

После добавления поддержки настройки объекта Джексона следующей наиболее желаемой проблемой было предоставление способа настройки механизма сериализации JSON .

В этой статье вы увидите, как настроить сериализатор JSON с помощью типов гибернации.

Как настроить #JSON Сериализатор, используемый #Hibernate -Типы – @vlad_mihalcea https://t.co/HD2OJJnl1S pic.twitter.com/zNBslsftIt

Декларативная конфигурация

Самый простой способ достичь этой цели-установить свойство hibernate.types.json.сериализатор конфигурации в файле hibernate.properties :

hibernate.types.json.serializer=com.vladmihalcea.hibernate.type.json.configuration.CustomJsonSerializerSupplier

Это свойство принимает полное имя класса реализации Пользовательского поставщика JsonSerializer интерфейса:

Что хорошо в настройке проекта hibernate-types , так это то, что вы можете использовать либо специфичный для Hibernate hibernate.properties , либо вы можете предоставить файл hibernate-types.properties , если вы не можете изменить hibernate.properties .

Вы даже можете предоставить другой файл свойств Java через hibernate-types.properties.путь Системное свойство,

Поставщик Пользовательского JsonSerializer может выглядеть следующим образом:

public class CustomJsonSerializerSupplier 
    implements JsonSerializerSupplier {

    @Override
    public JsonSerializer get() {
        return new CustomJsonSerializer();
    }
}

Здесь, для тестирования, мы используем пользовательский Пользовательский JsonSerializer , который реализует интерфейс JsonSerializer :

public class CustomJsonSerializer 
    implements JsonSerializer {

    private static boolean called;

    public static boolean isCalled() {
        return called;
    }

    public static void reset() {
        called = false;
    }

    @Override
    public  T clone(T value) {
        called = true;
        return JacksonUtil.clone(value);
    }
}

Мы собираемся использовать статическую переменную called , чтобы проверить в нашем модульном тесте, вызывается ли этот метод типами гибернации.

assertFalse(CustomJsonSerializer.isCalled());

doInJPA(entityManager -> {
    Location location = new Location();
    location.setCountry("Romania");
    location.setCity("Cluj-Napoca");
    location.setReference(
        BigDecimal.valueOf(2.25262562526626D)
    );

    Event event = new Event();
    event.setId(1L);
    event.setLocation(location);
    entityManager.persist(event);
});

assertTrue(CustomJsonSerializer.isCalled());
CustomJsonSerializer.reset();
assertFalse(CustomJsonSerializer.isCalled());

doInJPA(entityManager -> {
    Event event = entityManager.find(Event.class, 1L);
    assertEquals(
        "2.25262562526626", 
        event.getLocation().getReference().toString()
    );
});

assertTrue(CustomJsonSerializer.isCalled());

Как вы можете видеть, используется Пользовательский JsonSerializer , поэтому вы можете легко настроить способ сериализации данного объекта JSON с помощью типов hibernate.

Вывод

Из-за механизма настройки, который я ввел для настройки ObjectMapper , очень легко добавлять новые параметры конфигурации, например, этот, который позволяет изменять способ сериализации данного объекта JSON с помощью hibernate-типов.