Skip to content

NPE when transforming a tree to a model class object, at ArrayNode.elements() #4145

@OndraZizka

Description

@OndraZizka

Search before asking

  • I searched in the issues and found nothing similar.

Describe the bug

When deserializing a tree of JsonNodes, Jackson causes a NPE.

The ArrayNode where it fails is likely the one created this way in Kotlin:

tree.set<ObjectNode>("connectUiConfig", ObjectNode(factory, mapOf(
        "assetMetadataFilters" to ArrayNode(factory, ddbModel.systemData?.ui?.myOtherModel?.map { it ->
            MyOtherModelClass(...)
                .let { jsonMapper.valueToTree<ObjectNode>(it) }
        })
    )))

Which means, in ArrayNode(..., content), the content is null.

Version Information

2.15.2

Reproduction

tree.set<ObjectNode>("connectUiConfig", 
   ObjectNode(factory, mapOf(
        "assetMetadataFilters" to ArrayNode(..., null)
  ))
))

jsonMapper.treeToValue(tree, MyModel::class.java)

Where MyModel would be an appropriate class.

Expected behavior

  1. Maybe ArrayNode should not accept null as a content?

  2. Jackson should fail gracefully, with a proper error message

  3. Optionally, it could just create an empty array node in such situation, for those who prefer robustness over validity.

Additional context

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.mycompany.myapp.api.tenants.TenantApiGetModel["connectUiConfig"])
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:402) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:361) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.wrapAndThrow(BeanDeserializerBase.java:1853) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:572) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:439) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:4801) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2974) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:3438) ~[tenants-http-api.jar:?]
	at com.mycompany.myapp.api.SomeApiGetModelKt.from(SomeApiGetModel.kt:107) ~[tenants-http-api.jar:?]
Caused by: java.lang.NullPointerException
	at com.fasterxml.jackson.databind.node.ArrayNode.elements(ArrayNode.java:251) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.node.NodeCursor$ArrayCursor.<init>(NodeCursor.java:161) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.node.NodeCursor$ObjectCursor.startArray(NodeCursor.java:228) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.node.TreeTraversingParser.nextToken(TreeTraversingParser.java:118) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:425) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1409) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:352) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:185) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:545) ~[tenants-http-api.jar:?]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:570) ~[tenants-http-api.jar:?]
	... 76 more

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