Skip to content

Commit

Permalink
Fix NPE when traversing map.
Browse files Browse the repository at this point in the history
We now use regular iteration instead of the Stream API.

Closes: #4567
Original pull request: #4568
  • Loading branch information
christophstrobl authored and mp911de committed Dec 11, 2023
1 parent 69e1795 commit 17e8837
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -617,15 +617,20 @@ protected Object convertSimpleOrDocument(Object source, @Nullable MongoPersisten

if (source instanceof Map<?,?> sourceMap) {

return sourceMap.entrySet().stream().collect(Collectors.toMap(
entry -> ObjectUtils.nullSafeToString(converter.convertToMongoType(entry.getKey())),
entry -> {
if (entry.getValue() instanceof Document document) {
return getMappedObject(document, entity);
}
return delegateConvertToMongoType(entry.getValue(), entity);
}
));
Map<String, Object> map = new LinkedHashMap<>(sourceMap.size(), 1F);

sourceMap.entrySet().forEach(it -> {

String key = ObjectUtils.nullSafeToString(converter.convertToMongoType(it.getKey()));

if (it.getValue() instanceof Document document) {
map.put(key, getMappedObject(document, entity));
} else {
map.put(key, delegateConvertToMongoType(it.getValue(), entity));
}
});

return map;
}

return delegateConvertToMongoType(source, entity);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,18 @@ void mappingShouldNotContainTypeInformationWhenValueTypeOfMapMatchesDeclaration(
assertThat(mappedUpdate).doesNotContainKey("$set.concreteMap.jasnah._class");
}

@Test // GH-4567
void updateShouldAllowNullValuesInMap() {

Map<Object, NestedDocument> map = Collections.singletonMap("jasnah", new NestedDocument("kholin"));

Update update = new Update().set("concreteMap", Collections.singletonMap("jasnah", null));
Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(),
context.getPersistentEntity(EntityWithObjectMap.class));

assertThat(mappedUpdate).isEqualTo(new Document("$set", new Document("concreteMap", Collections.singletonMap("jasnah", null))));
}

@Test // DATAMONGO-1250
@SuppressWarnings("unchecked")
void mapsUpdateWithBothReadingAndWritingConverterRegistered() {
Expand Down

0 comments on commit 17e8837

Please sign in to comment.