View Javadoc
1   package top.infra.jackson2;
2   
3   import com.fasterxml.jackson.databind.Module;
4   import com.fasterxml.jackson.databind.ObjectMapper;
5   import com.fasterxml.jackson.databind.module.SimpleModule;
6   import com.fasterxml.jackson.datatype.joda.JodaModule;
7   import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
8   import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer;
9   
10  import lombok.extern.slf4j.Slf4j;
11  
12  import org.joda.time.DateTime;
13  import org.joda.time.format.DateTimeFormat;
14  import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
15  
16  import java.util.List;
17  
18  /**
19   * see: {@link org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration}.
20   * {@link JodaModule} will auto installed by {@link Jackson2ObjectMapperBuilder}
21   */
22  @Slf4j
23  public class JodaTimeJackson2Customizer implements Jackson2Customizer {
24  
25      @Override
26      public void customize(final Jackson2Properties properties, final ObjectMapper mapper) {
27          final Module jodaDateTimeSerializationModule = this.jodaDateTimeSerializationModule(properties);
28          mapper.registerModule(jodaDateTimeSerializationModule);
29      }
30  
31      @Override
32      public void customize(final Jackson2Properties properties, final Jackson2ObjectMapperBuilder builder) {
33          final Module jodaDateTimeSerializationModule = this.jodaDateTimeSerializationModule(properties);
34          final List<Module> modules = this.modules(builder);
35          modules.add(jodaDateTimeSerializationModule);
36          builder.modulesToInstall(modules.toArray(new Module[0]));
37      }
38  
39      public SimpleModule jodaDateTimeSerializationModule(final Jackson2Properties properties) {
40          SimpleModule module = new SimpleModule();
41          JacksonJodaDateFormat jacksonJodaFormat = getJacksonJodaDateFormat(properties);
42          if (jacksonJodaFormat != null) {
43              final DateTimeSerializer dateTimeSerializer = new DateTimeSerializer(jacksonJodaFormat); // jackson2 2.8.x
44              // since jackson2 2.9.x, see: JodaDateSerializerBase.FORMAT_STRING
45              //final DateTimeSerializer dateTimeSerializer = new DateTimeSerializer(jacksonJodaFormat, 1); // since jackson2 2.9.x
46              module.addSerializer(DateTime.class, dateTimeSerializer);
47          }
48          return module;
49      }
50  
51      JacksonJodaDateFormat getJacksonJodaDateFormat(final Jackson2Properties properties) {
52          if (properties.getJodaDateTimeFormat() != null) {
53              return new JacksonJodaDateFormat(DateTimeFormat.forPattern(properties.getJodaDateTimeFormat()).withZoneUTC());
54          }
55          if (properties.getDateFormat() != null) {
56              try {
57                  return new JacksonJodaDateFormat(DateTimeFormat.forPattern(this.dateFormat(properties)).withZoneUTC());
58              } catch (final IllegalArgumentException ex) {
59                  if (log.isWarnEnabled()) {
60                      log.warn("spring.jackson.date-format could not be used to "
61                          + "configure formatting of Joda's DateTime. You may want "
62                          + "to configure spring.jackson.joda-date-time-format as "
63                          + "well.");
64                  }
65              }
66          }
67          return null;
68      }
69  }