|
1 | 1 | /*
|
2 |
| - * Copyright 2012-2023 the original author or authors. |
| 2 | + * Copyright 2012-2024 the original author or authors. |
3 | 3 | *
|
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License");
|
5 | 5 | * you may not use this file except in compliance with the License.
|
|
27 | 27 |
|
28 | 28 | import javax.sql.DataSource;
|
29 | 29 |
|
| 30 | +import com.fasterxml.jackson.databind.ObjectMapper; |
30 | 31 | import org.apache.commons.logging.Log;
|
31 | 32 | import org.apache.commons.logging.LogFactory;
|
32 | 33 | import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy;
|
33 | 34 | import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
|
34 | 35 | import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
|
35 | 36 | import org.hibernate.cfg.AvailableSettings;
|
| 37 | +import org.hibernate.type.format.jackson.JacksonJsonFormatMapper; |
36 | 38 |
|
37 | 39 | import org.springframework.aot.hint.MemberCategory;
|
38 | 40 | import org.springframework.aot.hint.RuntimeHints;
|
|
42 | 44 | import org.springframework.aot.hint.TypeReference;
|
43 | 45 | import org.springframework.beans.factory.ObjectProvider;
|
44 | 46 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
| 47 | +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; |
45 | 48 | import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
|
46 | 49 | import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.HibernateRuntimeHints;
|
47 | 50 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
51 | 54 | import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
|
52 | 55 | import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
|
53 | 56 | import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
|
| 57 | +import org.springframework.context.annotation.Bean; |
54 | 58 | import org.springframework.context.annotation.Configuration;
|
| 59 | +import org.springframework.context.annotation.Import; |
55 | 60 | import org.springframework.context.annotation.ImportRuntimeHints;
|
56 | 61 | import org.springframework.jndi.JndiLocatorDelegate;
|
57 | 62 | import org.springframework.orm.hibernate5.SpringBeanContainer;
|
|
74 | 79 | @EnableConfigurationProperties(HibernateProperties.class)
|
75 | 80 | @ConditionalOnSingleCandidate(DataSource.class)
|
76 | 81 | @ImportRuntimeHints(HibernateRuntimeHints.class)
|
| 82 | +@Import(HibernateJpaConfiguration.HibernateJsonFormatMapperConfiguration.class) |
77 | 83 | class HibernateJpaConfiguration extends JpaBaseConfiguration {
|
78 | 84 |
|
79 | 85 | private static final Log logger = LogFactory.getLog(HibernateJpaConfiguration.class);
|
@@ -226,6 +232,19 @@ private Object getNoJtaPlatformManager() {
|
226 | 232 | "No available JtaPlatform candidates amongst " + Arrays.toString(NO_JTA_PLATFORM_CLASSES));
|
227 | 233 | }
|
228 | 234 |
|
| 235 | + @ConditionalOnClass({ ObjectMapper.class, JacksonJsonFormatMapper.class }) |
| 236 | + @ConditionalOnSingleCandidate(ObjectMapper.class) |
| 237 | + @Configuration(proxyBeanMethods = false) |
| 238 | + static class HibernateJsonFormatMapperConfiguration { |
| 239 | + |
| 240 | + @Bean |
| 241 | + HibernatePropertiesCustomizer jsonFormatMapperHibernatePropertiesCustomizer(ObjectMapper objectMapper) { |
| 242 | + return (properties) -> properties.putIfAbsent(AvailableSettings.JSON_FORMAT_MAPPER, |
| 243 | + new JacksonJsonFormatMapper(objectMapper)); |
| 244 | + } |
| 245 | + |
| 246 | + } |
| 247 | + |
229 | 248 | private static class NamingStrategiesHibernatePropertiesCustomizer implements HibernatePropertiesCustomizer {
|
230 | 249 |
|
231 | 250 | private final PhysicalNamingStrategy physicalNamingStrategy;
|
|
0 commit comments