Skip to content

Unable to deserialize YearMonth when running as java9 module, added with @JsonDeserialize annotation #202

@walkeros

Description

@walkeros

Consider following field annotated with YearMonth deserializer:


class MyClass {
  @JsonSerialize(using = YearMonthSerializer.class)
  @JsonDeserialize(using = YearMonthDeserializer.class)
  private final YearMonth period;
}

It looks to impossible to deserialize in such a way when running your app as named (java9) module. You will get:

java.lang.reflect.InaccessibleObjectException: Unable to make private com.fasterxml.jackson.datatype.jsr310.deser.YearMonthDeserializer() accessible: module com.fasterxml.jackson.datatype.jsr310 does not "opens com.fasterxml.jackson.datatype.jsr310.deser" to module com.fasterxml.jackson.databind
        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340) ~[?:?]
        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280) ~[?:?]
        at java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:189) ~[?:?]
        at java.lang.reflect.Constructor.setAccessible(Constructor.java:182) ~[?:?]
        at com.fasterxml.jackson.databind.util.ClassUtil.checkAndFixAccess(ClassUtil.java:934) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.util.ClassUtil.findConstructor(ClassUtil.java:568) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.util.ClassUtil.createInstance(ClassUtil.java:550) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.deserializerInstance(DefaultDeserializationContext.java:229) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findDeserializerFromAnnotation(BasicDeserializerFactory.java:2099) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.constructCreatorProperty(BasicDeserializerFactory.java:1019) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addExplicitPropertyCreator(BasicDeserializerFactory.java:634) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addExplicitAnyCreator(BasicDeserializerFactory.java:661) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:411) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:283) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:224) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:220) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:458) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:181) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:26) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.DeserializationContext.handlePrimaryContextualization(DeserializationContext.java:665) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:508) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:491) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4713) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4522) ~[jackson-databind-2.11.4.jar:?]
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3333) ~[jackson-databind-2.11.4.jar:?]
        at a.b.c.JsonLoader.load(JsonLoader.java:32) ~[abc-1.11.15-SNAPSHOT.jar:?]
    


The reason for the exception seems is that YearMonthDeserializer is located in jackson-datatype-jsr310 module and has private default constructor. There is an attempt to access that constructor by ClassUtil.checkAndFixAccess which is located in jackson-databind module. Since jackson-datatype-jsr310 does not opens that for reflection the call fails and desrialization is not possible.

Possible solutions would be change the access to constructor from private to public or open that class for reflection to jackson-databind

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions