Автор оригинала: 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 publicT 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-типов.