Registration of `jackson-datatype-jsr310` not working in Jackson 2.12.0
See original GitHub issueDescribe the bug
On 2.12.0 (2.11.3 doesn’t have this bug), findAndRegisterModules does not work for com.fasterxml.jackson.datatype:jackson-datatype-jsr310
.
Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.Duration` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
at [Source: (String)"{ "duration": "PT5M" }"; line: 1, column: 15] (through reference chain: me.retrodaredevil.solarthing.program.SolarMain$TestObject["duration"])
at me.retrodaredevil.solarthing.program.SolarMain.doMain(SolarMain.java:227)
at me.retrodaredevil.solarthing.program.SolarMain.main(SolarMain.java:275)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.Duration` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
at [Source: (String)"{ "duration": "PT5M" }"; line: 1, column: 15] (through reference chain: me.retrodaredevil.solarthing.program.SolarMain$TestObject["duration"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1766)
at com.fasterxml.jackson.databind.deser.impl.UnsupportedTypeDeserializer.deserialize(UnsupportedTypeDeserializer.java:36)
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:542)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:565)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:449)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1390)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4591)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3546)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3514)
Version information 2.12.0 on Java 11
To Reproduce
private static class TestObject {
private TestObject(@JsonProperty("duration") Duration duration) {
}
}
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
mapper.readValue("{ \"duration\": \"PT5M\" }", TestObject.class);
Expected behavior It should find the module and not throw the error above.
Additional context I tried putting my code in a JUnit5 test, and it passed perfectly, so this bug isn’t something that can be detected by unit tests. I’m using the shadow gradle plugin to compile my code into a fat jar, so something changed between 2.11 and 2.12 that causes this.
Also, adding the line mapper.registerModule(new JavaTimeModule());
fixes it, so I can guarantee that it exists on my classpath.
I wish I had some more info on why this is happening, but seeing how I can’t reproduce this in a unit test, I don’t really have any idea what the problem is.
Issue Analytics
- State:
- Created 3 years ago
- Reactions:2
- Comments:16 (8 by maintainers)
Top GitHub Comments
Adding dependency
helps me to solve the issue.
For future reference for those using the shadow plugin to build their jars, just add
mergeServiceFiles()
to yourshadowJar { }
config. https://stackoverflow.com/questions/32887966/shadow-plugin-gradle-what-does-mergeservicefiles-do#32902274That was an incredibly simple fix.