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 e20d12f commit 3dccdd2
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 3dccdd2

Please sign in to comment.