JodaTimeJackson2Customizer.java
package top.infra.jackson2;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.util.List;
/**
* see: {@link org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration}.
* {@link JodaModule} will auto installed by {@link Jackson2ObjectMapperBuilder}
*/
@Slf4j
public class JodaTimeJackson2Customizer implements Jackson2Customizer {
@Override
public void customize(final Jackson2Properties properties, final ObjectMapper mapper) {
final Module jodaDateTimeSerializationModule = this.jodaDateTimeSerializationModule(properties);
mapper.registerModule(jodaDateTimeSerializationModule);
}
@Override
public void customize(final Jackson2Properties properties, final Jackson2ObjectMapperBuilder builder) {
final Module jodaDateTimeSerializationModule = this.jodaDateTimeSerializationModule(properties);
final List<Module> modules = this.modules(builder);
modules.add(jodaDateTimeSerializationModule);
builder.modulesToInstall(modules.toArray(new Module[0]));
}
public SimpleModule jodaDateTimeSerializationModule(final Jackson2Properties properties) {
SimpleModule module = new SimpleModule();
JacksonJodaDateFormat jacksonJodaFormat = getJacksonJodaDateFormat(properties);
if (jacksonJodaFormat != null) {
final DateTimeSerializer dateTimeSerializer = new DateTimeSerializer(jacksonJodaFormat); // jackson2 2.8.x
// since jackson2 2.9.x, see: JodaDateSerializerBase.FORMAT_STRING
//final DateTimeSerializer dateTimeSerializer = new DateTimeSerializer(jacksonJodaFormat, 1); // since jackson2 2.9.x
module.addSerializer(DateTime.class, dateTimeSerializer);
}
return module;
}
JacksonJodaDateFormat getJacksonJodaDateFormat(final Jackson2Properties properties) {
if (properties.getJodaDateTimeFormat() != null) {
return new JacksonJodaDateFormat(DateTimeFormat.forPattern(properties.getJodaDateTimeFormat()).withZoneUTC());
}
if (properties.getDateFormat() != null) {
try {
return new JacksonJodaDateFormat(DateTimeFormat.forPattern(this.dateFormat(properties)).withZoneUTC());
} catch (final IllegalArgumentException ex) {
if (log.isWarnEnabled()) {
log.warn("spring.jackson.date-format could not be used to "
+ "configure formatting of Joda's DateTime. You may want "
+ "to configure spring.jackson.joda-date-time-format as "
+ "well.");
}
}
}
return null;
}
}