jackson-module-model-versioning
jackson-module-model-versioning copied to clipboard
VersioningModule clashes with other modules' settings
Hi, Not sure if this library is maintained. But anyway for documentation purposes, I've encountered the following issue:
public static class NoopVersionedModelConverter implements VersionedModelConverter {
@Override
public ObjectNode convert(ObjectNode modelData,
String modelVersion,
String targetModelVersion,
JsonNodeFactory nodeFactory) {
return modelData;
}
}
@JsonVersionedModel(currentVersion = "1", toPastConverterClass = NoopVersionedModelConverter.class)
private static class Versioned {
private OffsetDateTime offsetDateTime = null;
public Versioned() {
}
public OffsetDateTime getOffsetDateTime() {
return offsetDateTime;
}
public void setOffsetDateTime(OffsetDateTime offsetDateTime) {
this.offsetDateTime = offsetDateTime;
}
}
@Test
public void test() throws JsonProcessingException {
JavaTimeModule javaTimeModule = new JavaTimeModule();
VersioningModule versioningModule = new VersioningModule();
ObjectMapper objectMapper = new ObjectMapper().registerModule(javaTimeModule).registerModule(versioningModule);
OffsetDateTime original = OffsetDateTime.of(2022, 8, 9, 10, 10, 10, 10, ZoneOffset.UTC);
Versioned versioned = new Versioned();
versioned.setOffsetDateTime(original);
String json = objectMapper.writeValueAsString(versioned);
Versioned after = objectMapper.readValue(json, Versioned.class);
Assertions.assertEquals(original, after.getOffsetDateTime()); // fails
}
org.opentest4j.AssertionFailedError:
Expected :2022-08-09T10:10:10.000000010Z
Actual :2022-08-09T10:10:10Z
The issue seems to be in VersionedModelSerializer
line 95:
ObjectNode modelData = factory.createParser(buffer.toByteArray()).readValueAsTree();
The buffer passed to createParser
contains the nano-time but the resulting ObjectNode
holds the offsetDateTime with E notation thereby losing the nano value. When not the VersioningModule
is not registered on the ObjectMapper
, the OffsetDateTime
object is (de)serialized correctly.