View Javadoc
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   * The auto-configuration for Orika.
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       * The configuration properties for Orika.
31       */
32      private final OrikaProperties orikaProperties;
33  
34      /**
35       * The configurers for {@link MapperFactoryBuilder}.
36       */
37      private final Optional<List<OrikaMapperFactoryBuilderConfigurer>> orikaMapperFactoryBuilderConfigurers;
38  
39      /**
40       * The configurers for {@link MapperFactory}.
41       */
42      private final Optional<List<OrikaMapperFactoryConfigurer>> orikaMapperFactoryConfigurers;
43  
44      /**
45       * Creates a {@link MapperFactoryBuilder}.
46       *
47       * @return a {@link MapperFactoryBuilder}.
48       */
49      @ConditionalOnMissingBean
50      @Bean
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       * Creates a {@link MapperFactory}.
68       *
69       * @param orikaMapperFactoryBuilder the {@link MapperFactoryBuilder}.
70       * @return a {@link MapperFactory}.
71       */
72      @ConditionalOnMissingBean
73      @Bean
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       * Creates a {@link MapperFacade}.
85       *
86       * @param orikaMapperFactory the {@link MapperFactory}.
87       * @return a {@link MapperFacade}.
88       */
89      @ConditionalOnMissingBean
90      @Bean
91      public MapperFacade orikaMapperFacade(MapperFactory orikaMapperFactory) {
92          MapperFacade orikaMapperFacade = orikaMapperFactory.getMapperFacade();
93          log.debug("Created a MapperFacade: [{}]", orikaMapperFacade);
94          return orikaMapperFacade;
95      }
96  
97  }