1 package net.rakugakibox.spring.boot.orika;
2
3 import java.util.Collections;
4 import java.util.List;
5 import java.util.Optional;
6
7 import lombok.RequiredArgsConstructor;
8 import lombok.extern.slf4j.Slf4j;
9 import ma.glasnost.orika.MapperFacade;
10 import ma.glasnost.orika.MapperFactory;
11 import ma.glasnost.orika.impl.DefaultMapperFactory;
12 import ma.glasnost.orika.impl.DefaultMapperFactory.MapperFactoryBuilder;
13 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
14 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
15 import org.springframework.boot.context.properties.EnableConfigurationProperties;
16 import org.springframework.context.annotation.Bean;
17 import org.springframework.context.annotation.Configuration;
18
19
20
21
22 @RequiredArgsConstructor
23 @Slf4j
24 @ConditionalOnProperty(name = "orika.enabled", matchIfMissing = true)
25 @EnableConfigurationProperties(OrikaProperties.class)
26 @Configuration
27 public class OrikaAutoConfiguration {
28
29
30
31
32 private final OrikaProperties orikaProperties;
33
34
35
36
37 private final Optional<List<OrikaMapperFactoryBuilderConfigurer>> orikaMapperFactoryBuilderConfigurers;
38
39
40
41
42 private final Optional<List<OrikaMapperFactoryConfigurer>> orikaMapperFactoryConfigurers;
43
44
45
46
47
48
49 @ConditionalOnMissingBean
50 @Bean
51 public MapperFactoryBuilder<?, ?> orikaMapperFactoryBuilder() {
52 DefaultMapperFactory.Builder orikaMapperFactoryBuilder = new DefaultMapperFactory.Builder();
53 if (orikaProperties.getUseBuiltinConverters() != null) {
54 orikaMapperFactoryBuilder.useBuiltinConverters(orikaProperties.getUseBuiltinConverters());
55 }
56 if (orikaProperties.getUseAutoMapping() != null) {
57 orikaMapperFactoryBuilder.useAutoMapping(orikaProperties.getUseAutoMapping());
58 }
59 if (orikaProperties.getMapNulls() != null) {
60 orikaMapperFactoryBuilder.mapNulls(orikaProperties.getMapNulls());
61 }
62 if (orikaProperties.getDumpStateOnException() != null) {
63 orikaMapperFactoryBuilder.dumpStateOnException(orikaProperties.getDumpStateOnException());
64 }
65 if (orikaProperties.getFavorExtension() != null) {
66 orikaMapperFactoryBuilder.favorExtension(orikaProperties.getFavorExtension());
67 }
68 if (orikaProperties.getCaptureFieldContext() != null) {
69 orikaMapperFactoryBuilder.captureFieldContext(orikaProperties.getCaptureFieldContext());
70 }
71 orikaMapperFactoryBuilderConfigurers
72 .orElseGet(Collections::emptyList)
73 .forEach(configurer -> configurer.configure(orikaMapperFactoryBuilder));
74 log.debug("Created a MapperFactoryBuilder: [{}]", orikaMapperFactoryBuilder);
75 return orikaMapperFactoryBuilder;
76 }
77
78
79
80
81
82
83
84 @ConditionalOnMissingBean
85 @Bean
86 public MapperFactory orikaMapperFactory(MapperFactoryBuilder<?, ?> orikaMapperFactoryBuilder) {
87 MapperFactory orikaMapperFactory = orikaMapperFactoryBuilder.build();
88 orikaMapperFactoryConfigurers
89 .orElseGet(Collections::emptyList)
90 .forEach(configurer -> configurer.configure(orikaMapperFactory));
91 log.debug("Created a MapperFactory: [{}]", orikaMapperFactory);
92 return orikaMapperFactory;
93 }
94
95
96
97
98
99
100
101 @ConditionalOnMissingBean
102 @Bean
103 public MapperFacade orikaMapperFacade(MapperFactory orikaMapperFactory) {
104 MapperFacade orikaMapperFacade = orikaMapperFactory.getMapperFacade();
105 log.debug("Created a MapperFacade: [{}]", orikaMapperFacade);
106 return orikaMapperFacade;
107 }
108
109 }