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          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       * Creates a {@link MapperFactory}.
80       *
81       * @param orikaMapperFactoryBuilder the {@link MapperFactoryBuilder}.
82       * @return a {@link MapperFactory}.
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       * Creates a {@link MapperFacade}.
97       *
98       * @param orikaMapperFactory the {@link MapperFactory}.
99       * @return a {@link MapperFacade}.
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 }