javajacksonjodatimejackson-databind

Joda date/time type `org.joda.time.Days` not supported by default:


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?

enter image description here


Solution

  • 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