Но как я могу сериализовать ленивые классы JSON с использованием стандартного Джексона?
конвертер сообщений, причину которого я добавил в свой XML-файл.
Прежде всего, я не советую использовать DTO / Value Object только для решения этой проблемы.
В начале вам может показаться, что это легко, но при каждой новой разработке / изменении дублирующий код означает, что каждый раз нужно вносить две модификации ... в противном случае ошибки.
Я не имею в виду, что VO или DTO - это неприятные запахи, но вы должны использовать их по причинам, для которых они предназначены (например, для предоставления контента / структуры, которые различаются в зависимости от логических уровней или решения неразрешимой проблемы сериализации).
Если у вас есть чистый и эффективный способ решения проблемы сериализации без VO / DTO и они вам не нужны, не используйте их.
И об этом, есть много способов решить проблему отложенной загрузки, когда вы используете Джексона с Hibernate сущностями.
На самом деле самый простой способ - это использовать FasterXML / jackson-datatype-hibernate
Проект по созданию модуля Джексона (jar) для поддержки сериализации JSON
и десериализация Hibernate (http://hibernate.org) специфично
типы данных и свойства; особенно ленивые аспекты.
Он предоставляет Hibernate3Module/Hibernate4Module/Hibernate5Module
, модули расширения, которые можно зарегистрировать с помощью ObjectMapper
, чтобы обеспечить четко определенный набор расширений, связанных со спецификой Hibernate.
Чтобы это работало, вам просто нужно добавить необходимую зависимость и добавить
Модуль Джексона доступен во время обработки там, где он требуется.
Если вы используете Hibernate 3:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate3</artifactId>
<version>${jackson.version.datatype}</version>
</dependency>
Если вы используете Hibernate 4:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate4</artifactId>
<version>${jackson.version.datatype}</version>
</dependency>
И так для ...
Где jackson.version.datatype
должно быть одинаковым для используемой версии Джексона и расширения типа данных ackson.
Если вы используете или можете использовать Spring Boot, вам просто нужно объявить модуль как bean-компонент в определенном классе Configuration
или в классе SpringBootApplication
, и он будет автоматически зарегистрирован для любого созданного Jackson ObjectMapper
.
В разделе 74.3 Customize the Jackson ObjectMapper
Spring Boot указано, что:
Любые бобы типа com.fasterxml.jackson.databind.Module
будут
автоматически регистрируется в автоматически настроенном
Jackson2ObjectMapperBuilder
и применяется к любым ObjectMapper
экземплярам
что это создает. Это обеспечивает глобальный механизм для содействия
пользовательские модули при добавлении новых функций в ваше приложение.
Например:
@Configuration
public class MyJacksonConfig {
@Bean
public Module hibernate5Module() {
return new Hibernate5Module();
}
}
или:
@SpringBootApplication
public class AppConfig {
public static void main(String[] args) throws IOException {
SpringApplication.run(AppConfig.class, args);
}
@Bean
public Module hibernate5Module() {
return new Hibernate5Module();
}
}