jackson-module-model-versioning icon indicating copy to clipboard operation
jackson-module-model-versioning copied to clipboard

VersioningModule clashes with other modules' settings

Open roded opened this issue 1 year ago • 0 comments

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.

roded avatar Mar 21 '23 10:03 roded