I used joda 2.10.14 time and jackson2 2.18.3,
jackson-core-2.18.3.jar
jackson-databind-2.18.3.jar
jackson-datatype-joda-2.18.3.jar
joda-time-2.10.14.jar
I have register JodaModule, but it also throw Exception, my code is
public static void main(String[] args) throws JsonProcessingException {
DateTime dateTime = new DateTime();
Days days = Days.days(1);
Map<String, Object> map = new HashMap<>();
map.put("dateTime", dateTime);
map.put("days", days);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JodaModule());
String json = objectMapper.writeValueAsString(map);
System.out.println(json);
}
the exception
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Joda date/time type `org.joda.time.Days` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-joda" to enable handling (through reference chain: java.util.HashMap["days"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1340)
at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:808)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341)
at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4819)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:4060)
at azkaban.utils.JSONUtils.main(JSONUtils.java:96)
I checked JodaModule code, found that it is not add Days deserializer. So, how should I resolve this issue?
The code maintainers have helped fix this problem.
The fix is basically in line with my own implementation.
They have written separate serialization and deserialization classes for each subclass of ReadablePeriod and registered them in the JodaModule. like this:
com.fasterxml.jackson.datatype.joda.ser.DaysSerializer
https://github.com/FasterXML/jackson-datatype-joda/issues/162
https://github.com/FasterXML/jackson-datatype-joda/issues/160