Skip to content

DefaultArangoConverter fails to serialize nested Maps with null values #199

@nikita-i-turvo

Description

@nikita-i-turvo

Affected versions: <=3.2.5

Problem: DefaultArangoConverter#writeMap throws NullPointerException, when one of the entries contains null value.
Given document with the following shape, processing will go like this:

{
  "simpleAttribute": null, // will be skipped by `DefaultArangoConverter#writeEntity`
  "nestedMap": { // will be processed with `DefaultArangoConverter#writeInternal` and `DefaultArangoConverter#writeMap`
    "key": null // processing will be attempted with `DefaultArangoConverter#writeInternal`, which can't handle `null`s
  }
}

Similar problem (unguarded call to DefaultArangoConverter#writeInternal) exists in DefaultArangoConverter#writeCollection and DefaultArangoConverter#writeArray.

Stack trace:

java.lang.NullPointerException: null
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeInternal(DefaultArangoConverter.java:574) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeMap(DefaultArangoConverter.java:707) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeInternal(DefaultArangoConverter.java:592) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeProperty(DefaultArangoConverter.java:691) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.lambda$writeEntity$7(DefaultArangoConverter.java:633) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:355) ~[spring-data-commons-2.2.4.RELEASE.jar:2.2.4.RELEASE]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeEntity(DefaultArangoConverter.java:620) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.writeInternal(DefaultArangoConverter.java:605) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.write(DefaultArangoConverter.java:564) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.DefaultArangoConverter.write(DefaultArangoConverter.java:88) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.convert.ArangoEntityWriter.write(ArangoEntityWriter.java:37) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.template.ArangoTemplate.toVPack(ArangoTemplate.java:283) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
	at com.arangodb.springframework.core.template.ArangoTemplate.insert(ArangoTemplate.java:581) ~[arangodb-spring-data-3.2.5.jar:3.2.5]
        ...

Proposed solution:

  1. Add a null guard and skip an entry if value is null in DefaultArangoConverter#writeMap, similar to
value = accessor.getProperty(property);
if (value != null) {
  this.writeProperty(value, sink, property);
}

block in DefaultArangoConverter#writeEntity
2. Add a null check and write nulls with DefaultArangoConverter#writeSimple and anything else with DefaultArangoConverter#writeInternal in DefaultArangoConverter#writeCollection and DefaultArangoConverter#writeArray

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions