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
20
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);
44
45
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 }