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 @Configuration
23 @ConditionalOnProperty(name = "orika.enabled", matchIfMissing = true)
24 @EnableConfigurationProperties(OrikaProperties.class)
25 @RequiredArgsConstructor
26 @Slf4j
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 @Bean
50 @ConditionalOnMissingBean
51 public MapperFactoryBuilder<?, ?> orikaMapperFactoryBuilder() {
52 DefaultMapperFactory.Builder orikaMapperFactoryBuilder = new DefaultMapperFactory.Builder();
53 orikaProperties.getUseBuiltinConverters().ifPresent(orikaMapperFactoryBuilder::useBuiltinConverters);
54 orikaProperties.getUseAutoMapping().ifPresent(orikaMapperFactoryBuilder::useAutoMapping);
55 orikaProperties.getMapNulls().ifPresent(orikaMapperFactoryBuilder::mapNulls);
56 orikaProperties.getDumpStateOnException().ifPresent(orikaMapperFactoryBuilder::dumpStateOnException);
57 orikaProperties.getFavorExtension().ifPresent(orikaMapperFactoryBuilder::favorExtension);
58 orikaProperties.getCaptureFieldContext().ifPresent(orikaMapperFactoryBuilder::captureFieldContext);
59 orikaMapperFactoryBuilderConfigurers
60 .orElseGet(Collections::emptyList)
61 .forEach(configurer -> configurer.configure(orikaMapperFactoryBuilder));
62 log.debug("Created a MapperFactoryBuilder: [{}]", orikaMapperFactoryBuilder);
63 return orikaMapperFactoryBuilder;
64 }
65
66
67
68
69
70
71
72 @Bean
73 @ConditionalOnMissingBean
74 public MapperFactory orikaMapperFactory(MapperFactoryBuilder<?, ?> orikaMapperFactoryBuilder) {
75 MapperFactory orikaMapperFactory = orikaMapperFactoryBuilder.build();
76 orikaMapperFactoryConfigurers
77 .orElseGet(Collections::emptyList)
78 .forEach(configurer -> configurer.configure(orikaMapperFactory));
79 log.debug("Created a MapperFactory: [{}]", orikaMapperFactory);
80 return orikaMapperFactory;
81 }
82
83
84
85
86
87
88
89 @Bean
90 @ConditionalOnMissingBean
91 public MapperFacade orikaMapperFacade(MapperFactory orikaMapperFactory) {
92 MapperFacade orikaMapperFacade = orikaMapperFactory.getMapperFacade();
93 log.debug("Created a MapperFacade: [{}]", orikaMapperFacade);
94 return orikaMapperFacade;
95 }
96
97 }